代码
1.cpp
#include <string.h>
struct s {
char data1;
short data2;
int data3;
long data4;
};
// 定义C++函数,汇编符号标头由g++编译器按规则生成
void fun(void) {
struct s src;
src.data1 = 'A';
src.data2 = 2;
src.data3 = 3;
src.data4 = 4;
struct s res;
memcpy(&res, &src, sizeof(struct s));
}
2.cpp
#include <string.h>
struct s {
char data1;
short data2;
int data3;
long data4;
};
extern "C" {
// 定义C函数,汇编符号标头就是fun
void fun(void) {
struct s src;
src.data1 = 'A';
src.data2 = 2;
src.data3 = 3;
src.data4 = 4;
struct s res;
memcpy(&res, &src, sizeof(struct s));
}
}
main1.cpp
extern void fun(void); // 声明C++函数,汇编符号标头由g++编译器按规则生成
int main(int argc, char** argv) {
fun();
return 0;
}
main2.cpp
extern "C" {
void fun(void); // 声明C函数,汇编符号标头就是fun
}
int main(int argc, char** argv) {
fun();
return 0;
}
makefile
default:
g++ -c 1.cpp
g++ -c 2.cpp
g++ -c main1.cpp
g++ -c main2.cpp
nm 1.o > 1.nm
nm 2.o > 2.nm
nm main1.o > main1.nm
nm main2.o > main2.nm
g++ 1.o main1.o -o main1.exe
g++ 2.o main2.o -o main2.exe
objdump -S main1.exe > main1.dis
objdump -S main2.exe > main2.dis
.PHONY:clean
clean:
rm -f *.o *.nm *.exe *.dis
效果
总结
1.根据第一张结果图和第二张结果图,可知extern "C"使fun函数的符号保留为fun
2.根据第三章结果图,可知只要都是用同一个g++编译器,fun函数除了符号不同外,汇编实现无差别