问题extern 函数
常常见extern放在函数的前面成为函数声明的一部分那么C语言的关键字extern在函数的声明中起什么作用?
答案与分析
如果函数的声明中带有关键字extern仅仅是暗示这个函数可能在别的源文件里定义没有其它作用即下述两个函数声明没有明显的区别
extern int f(); 和int f();
当然这样的用处还是有的就是在程序中取代include *h来声明函数在一些复杂的项目中我比较习惯在所有的函数声明前添加extern修饰
问题extern 函数
当函数提供方单方面修改函数原型时如果使用方不知情继续沿用原来的extern申明这样编译时编译器不会报错但是在运行过程中因为少了或者多了输入参数往往会照成系统错误这种情况应该如何解决?
答案与分析
目前业界针对这种情况的处理没有一个很完美的方案通常的做法是提供方在自己的xxx_pubh中提供对外部接口的声明然后调用方include该头文件从而省去extern这一步以避免这种错误
宝剑有双锋对extern的应用不同的场合应该选择不同的做法
问题extern C
在C++环境下使用C函数的时候常常会出现编译器无法找到obj模块中的C函数定义从而导致链接失败的情况应该如何解决这种情况呢?
答案与分析
C++语言在编译的时候为了解决函数的多态问题会将函数名和参数联合起来生成一个中间的函数名称而C语言则不会因此会造成链接时找不到对应函数的情况此时C函数就需要用extern C进行链接指定这告诉编译器请保持我的名称不要给我生成用于链接的中间函数名
下面是一个标准的写法
//在h文件的头上
#ifdef __cplusplus
#if __cplusplus
extern C{
#endif
#endif /* __cplusplus */
…
…
//h文件结束的地方
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
[] []