符号修饰与函数签名

p_87

Linux下的GCC编译器中,默认情况下已经去掉了在C语言符号前加"_"的方式,但是Windows平台下的编译器还保持着在符号前加"_"的习惯。


函数签名使得函数在目标文件中的符号变成与其源文件的函数名、函数参数、所在的类和名称空间及其它信息关联了起来。
函数签名经名称修饰变成修饰后名称目标文件中的符号名,变量亦如此。
c++filt工具可以用来解析被修饰过的名称,比如:
c++filt _ZN1N1C4funcEi
输出:N::C::func(int)


C++为了与C兼容,在符号管理上,C++有一个用来声明或定义一个C符号的"extern "C""关键字用法:
例如:
extern "C" {
    int function(int);
    int var;
}
extern "C" int func(int);

C++编译器会将在extern "C" 的大括号内部的代码当作C语言代码处理,此时C++的名称修饰机制将不会起作用。

为了C 与 C++兼容性,可以使用条件宏判断当前编译单元是不是C++代码:
#ifdef __cplusplus
extern "C" {
#endif

void *memset (void *, int size_t);

#ifdef __cplusplus
}
#endif

原文地址:https://www.cnblogs.com/openix/p/2834530.html