最近看一些项目代码 总会出现这样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编译器,否则 不做什么。
7671

被折叠的 条评论
为什么被折叠?



