浅析浅析extern “C”的作用的作用
关于extern “C”的作用和意思,网上资料已经有很多了(我也参考了几篇),不过我还是觉得有必要自己总结一
下,毕竟“好记性不如烂笔头”嘛~~
到C标准函数库的头文件里看看,一般会经常看见有如下宏定义(除非你从来没有查看类似printf函数在头文件中的定义,就另
当别论了:-()
#ifdef__cplusplus
extern"C"{
#endif
……(C函数声明)
#ifdef__cplusplus
}
#endif
简单来说,这个extern“C”用于C++代码调用C的函数(至于C代码如何调用C++函数,还是问问Google大神吧~)
先撇开上述的extern “C”,看看C函数和C++函数的汇编代码,就知道在目标文件中,C函数名和C++函数名采用不同的命名规
则。
VS2010新建一个Windows Console工程,添加一个.c和.cpp文件,文件里的代码都一样,如下
voidhello()
{
}
为了使汇编文件的内容简单一些,这里函数体是空,而且没有引入任何头文件。VS2010默认不输出.asm文件,即汇编文件。
在工程的配置中,让VS2010输出汇编文件,如下
编译解决方案(或按“F7”),可以在工程目录的Debug文件夹下,找到对应的两个汇编文件,内容如下
没有必要把这里全部的汇编代码看懂,只要明白在源代码中同一个hello函数,在翻译过来的.asm文件中,hello函数名的命名
不一样就行了。
很明显,如果C++代码要调用C函数,需要按照C函数编译后的函数名去调用这个函数。所以,extern “C”的作用就是告诉编译
器,花括号“{}”中间的这些函数声明全部都是C函数。
下面修改一下.c和.cpp文件的内容,如下
//C代码
#include<stdio.h>
voidhello()
{
printf("Hello,world!");
}
//C++代码
voidhello();
intmain(void)
{
hello();