关于extern "C"解释

来源:互联网 发布:ubuntu 查看内存占用 编辑:程序博客网 时间:2024/06/05 19:42

在代码中,头文件里面经常看到
#ifndef EXAMPLE_HEAD_INCLUDE
#define EXAMPLE_HEAD_INCLUDE

#ifdef __cplusplus
extern "C" {
#endif

//code body.

#ifdef __cplusplus
}
#endif

#endif

这种代码结构,也许还有人不清楚这样写代码的理由.

这里解释下:
1)首先包含extern:
表示这里面声明的变量和函数都是具有extern属性的.extern后面的仅仅是声明,而不是定义,也就是不会分配相应的内存空间,需要相应的变量和接口的,直接引用头文件就可以了.与extern对应的static变量,则不可以放在里面.

2)然后就是"C":
表示下面的变量和接口是按照C语言的方式进行编译和连接的,在c++和c的区别中有一个就是重载与否的问题,c++能重载,而c不能,原因就是在编译的时候.
比如说一个函数 void function(int,float);在c编译方式下,编译出的内容是_function,而在c++中编译出来则是function_int_float,这也是为什么c++能够根据参数的个数或者类型不一样而链接到相应的函数的原因.c++的其他变量和类也都是采取相同的方式.
所以,用extern "C"后,就指明了使用c编译器的方式.extern "C"仅仅指定的编译和链接的方式,至于语义的检查则还是要依据原语言来进行.

3)顺便说下用#ifndef/#endif来防止重复包含头文件.
在第一次调用example.h文件时,没有EXAMPLE_HEAD_INCLUDE宏变量,那么#ifndef和#endif之间的代码就会有效,执行下去,但是如果第二次进行包含的时候,监测到EXAMPLE_HEAD_INCLUDE变量已经有了,因此#ifndef和#endif之间的代码就失效了.这样就防止了头文件的重复包含,这里也间接的说明了一个问题,预处理变量是全局有效的.
所以在头文件中使用了这种声明方式的话,就表明在extern "C"下面的语句都要以c编译器的方式进行编译.这种情况只出现在c++要引用c代码的情况,而c语言中是不支持extern "C"的这种声明的.

总结起来,extern "C"让你代码里面可以混合c++和c的代码,而不会出任何问题.在c代码和c++代码相互嵌套的时候要注意,在c语言中是不支持extern "C"这种声明方式的.

 

把我累的...``