众所周知,extern “C" 链接指示符放在函数声明前将说明该函数在被调用时采用c风格链接,实质就是链接的函数名将按照C的风格生成。
当在写C++函数重载时,当我们按照正常的写法是没问题的,但是当我们在其中的函数定义前加上extern ”C“链接指示符时是否影响C++的函数重载呢?
如下示例:
- void print(int a)
- {
- cout << a << endl;
- }
- extern "C" void print(double b)
- {
- cout << b << endl;
- }
实际extern ”C“ 并不影响C++的函数重载。因为函数重载实际就是在编译期间编译器根据函数名,参数列表等信息根据某种规则生成一个唯一标识该函数的符号。
当采用extern "C" 时,我们知道这两个函数在obj文件的符号已经不一样,所以这与函数重载的原理是吻合的,并不冲突,故extern "C" 不影响函数重载。
但当如下使用时是错误的。
- extern "C" void print(int a)
- {
- cout << a << endl;
- }
- extern "C" void print(double b)
- {
- cout << b << endl;
- }
- void print(std::string s)
- {
- cout << s << endl;
- }
因为C语言不支持函数重载,所以当如上使用时是错误的。我们也很容易理解,在C中函数编译时只与函数名有关,并不与函数参数列表有关,当如上使用时,有两个同名函数都采用C风格链接方式时,就会产生二义性,编译器会不知所措,所以是错误的