关于extern “C” 对函数重载的影响

众所周知,extern “C" 链接指示符放在函数声明前将说明该函数在被调用时采用c风格链接,实质就是链接的函数名将按照C的风格生成。

 

当在写C++函数重载时,当我们按照正常的写法是没问题的,但是当我们在其中的函数定义前加上extern ”C“链接指示符时是否影响C++的函数重载呢?

 

如下示例:

  1. void print(int a)
  2. {
  3.    cout << a << endl;
  4. }
  5. extern "C" void print(double b)
  6. {
  7.    cout << b << endl;
  8. }

实际extern ”C“ 并不影响C++的函数重载。因为函数重载实际就是在编译期间编译器根据函数名,参数列表等信息根据某种规则生成一个唯一标识该函数的符号。

 

当采用extern "C" 时,我们知道这两个函数在obj文件的符号已经不一样,所以这与函数重载的原理是吻合的,并不冲突,故extern "C" 不影响函数重载。

 

但当如下使用时是错误的。

  1. extern "C" void print(int a)
  2. {
  3.    cout << a << endl;
  4. }
  5. extern "C" void print(double b)
  6. {
  7.    cout << b << endl;
  8. }
  9. void print(std::string s)
  10. {
  11.    cout << s << endl;
  12. }

因为C语言不支持函数重载,所以当如上使用时是错误的。我们也很容易理解,在C中函数编译时只与函数名有关,并不与函数参数列表有关,当如上使用时,有两个同名函数都采用C风格链接方式时,就会产生二义性,编译器会不知所措,所以是错误的

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值