extern C

最近看一些项目代码 总会出现这样extern C也比较迷糊,查查资料,问了问人 ,搞明白了,现在记下 O(∩_∩)O~

//在.h文件的头上

  #ifdef __cplusplus

  #if __cplusplus

  extern "C"{

  #endif

  #endif /* __cplusplus */

  …

  …

  //.h文件结束的地方

  #ifdef __cplusplus

  #if __cplusplus

  }

  #endif

  #endif /* __cplusplus */

这块要弄明白这些含义,大部分人会说这就是加让c和c++兼容,但是再往深究 就有点不知道了。想往深究,弄明白,并且对着感兴趣的同学 可以往下看看。

再弄明白这怎么回事,先看下边列子

if 有a.c和b.c两个文件:

a.c中

int main()

{

      int A =10;

       foo();

}

b.c中:

extern foo()

extern A

int main()

{

   foo();

  printf("%d",A);

 

}

 

假如上面a.c 和b.c都是c编译器,就不会出错,编译会生成目标文件一般就是.o或是.obj文件,然后这些文件链接生产的可执行文件或者库文件,问题就出来了,它是通过上面来进行链接的 b.c怎么找到foo()这个函数的,地址的。原因就是当生成.o文件后,foo()函数就会被标记为foo,直接找到这个foo标志位就可以找打函数入口了。这样链接的问题就解决了。但这有何extern “C”有毛线关系,稍安勿躁,先喝口水。假如上面a.c b.c是通过c++编译器编译,很可能foo()这个函数的标记编成了Afoo,和c编译器中的foo标记不一样了。假如a.c是c编译器,b.c是c++编译器 编译的 这问题就出来了,链接出现失败了,所以为了兼容,才出现了上面的那种写法。

__cplusplus是c++编译器的宏,上面大体意思是,如果是c++编译器,包含进来c编译器,否则 不做什么。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值