extern “C“的作用效果

代码

extern “C“的作用效果_第1张图片

1.cpp

#include 

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 

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

效果

extern “C“的作用效果_第2张图片

extern “C“的作用效果_第3张图片

extern “C“的作用效果_第4张图片

总结

1.根据第一张结果图和第二张结果图,可知extern "C"使fun函数的符号保留为fun

2.根据第三章结果图,可知只要都是用同一个g++编译器,fun函数除了符号不同外,汇编实现无差别

3.若头文件用extern C声明了,但是源文件里没有用extern C声明,对应函数的汇编标头采用g++规则,且g++能够链接成功(猜测g++链接顺序为gcc函数标头,g++函数标头)

你可能感兴趣的:(cpp,c语言,c++)