在看了C语言参考手册这本书之后,发现声明和定义是很深奥的。
extern int i ;
extern void write(void)
首先说明下extern的作用:
基本上都是两个作用:
①:放在变量或函数之前,表示在这里只是一个声明,该变量或函数已经在别处定义了;
比如test.h 在该头文件中声明
extern int i;
void write(void);
然后在test.cpp中包含test.h头文件
int i; //声明全局变量
void write(void)
{
...........................................
}
这样任何包含test.h头文件的都可以使用全局变量 i 了,
②:extern "C"
与"C" 一起用,主要在C++代码中调用C编译的动态库,或者再C++代码中要以C风格编译C++方法:
如果C调用C++编译的动态库(没有添加extern "C"),在链接的时候会提示函数找不到,
为什么是这样呢?
原因:C++支持函数重载,在编译的时候会根据函数名和参数生成一个中间名字;但是在C中不会生成中间名字的;
例如C++代码中要调用ffmpeg的代码(ffmpeg是由C实现的),如果在调用时没有添加extern "C",编译的时候是正常的,
但是到链接时就会提示找不到函数名称,这是只要加上extern "C"就解决了该问题。
#ifdef __cplusplus
extern "C"
{
#endif
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
#ifdef __cplusplus
}
#endif
接下来介绍将声明和定义分开有什么好处:在项目中一般都是将声明放在.h文件;定义放在.cpp或.c文件,这样的好处不仅仅逻辑清晰,
同时对用户只暴露接口,实现部分很好的隐藏起来了。