关于extern "C"解释

, 本文解释了头文件中常见结构`#ifndef/#define/#ifdef`的作用,阐述了`extern C`的重要性,以及如何防止头文件重复包含。详细讨论了C++和C在函数重载、编译方式上的区别,同时强调了`extern C`在混合使用C++和C代码时的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在代码中,头文件里面经常看到

#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"这种声明方式的.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值