本节书摘来自异步社区出版社《c和c++程序员面试秘笈》一书中的第1章,第1.10节,作者: 董山海,更多章节内容可以访问云栖社区“异步社区”公众号查看。
c和c++程序员面试秘笈
为什么标准头文件都有类似以下的结构?
考点: 标准头文件中一些通用结构的理解
出现频率:
void foo( int x, int y );
void foo( int x, float y );<code>`</code>
这两个函数编译生成的符号是不相同的,前者可能为_foo_int_int之类,而后者可能为_foo_int_float之类。可以发现,这样的名字包含了函数名、函数参数数量及类型信息,c++就是靠这种机制来实现函数重载的。这样,如果在c中连接c++编译的符号时,就会因找不到符号问题发生连接错误。
如果加extern "c"声明后,模块编译生成foo的目标代码时,就不会对其名字进行特殊处理,采用了c语言的方式,也就是_foo之类,不会加上后面函数参数数量及类型信息相关的那一串了。因此extern "c"是c++编译器提供的与c连接交换指定的符号,用来解决名字匹配问题。
【答案】
代码第1、2、10行的作用是防止该头文件被重复引用。
代码第3行的作用是表示当前使用的是c++编译器。
代码第4~8行中的extern "c"是c++编译器提供的与c连接交换指定的符号,用来解决名字匹配问题。