![](https://img.haomeiwen.com/i1970049/9516266828ce7856.jpg)
目录
1同一个工程一个c文件函数调用另一个c文件函数
2 c文件调用另一个c文件变量
3 c++调用c函数
4 c 调用c++函数
正文
1 extern 函数
为什么要用extern 函数呢?#include头文件不就行了吗 ?比如 c库函数, 引用c库函数啥时候用extern呢?
下面让我们看个例子,如PowerSetDemo.cpp 想调用powerSet1.cpp中的GetPowerSet函数,
有两种方法:
方法1:include 头文件 ; #include powerSet1.h
方法2: extern 方法 . extern void GetPowerSet.这句在调用文件中使用,表示引用全局函数GetPowerSet().
不用#include powerSet1.h. 这样就不会引入大量头文件,进而不会引入大量的无关函数.这样写编译不会出错。在makefile中需要PowerSetDemo.o和powerSet1.o写在一起,否则link的时候找不到GetPowerSet而报错。
2 extern 变量
2.1 当gcc assert.c b.c 将两个文件一起编译,这样两个文件看成一个工程。
这样在b.c中定义的a变成全局变量,在assert.c 中用extern ,表示引用依赖相关的.o中global a这个变量,本例即b.c中的变量a。gcc 编译后,a.out会从b.o,assert.o 中自动查找。不用user care。
2.2 当gcc assert.c b.c a.c 将三个文件一起编译,这样三个文件看成一个工程。
这样在b.c中定义的a变成全局变量,同样也在a.c中定义的a变成全局变量。
这样造成整个工程的全局变量冲突错误.
njpc:felix/temp/ctest >127> gcc assert.c a.c b.c
/var/tmp//ccg3SW15.o:(.bss+0x0): multiple definition of `a'
/var/tmp//ccOJUg1q.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
2.3 将global a变量放到common.h中,各个文件引用common.h 是不是可以共享全局变量呢?
答案是不能。比如ab.cpp ,cd.cpp 都#include common.h造成,编译ab.cpp,cd.cpp 的时候都编译int global a,所以造成重复定义的error。
唯一正确的方式:改用在一个cpp中extern int global;这样整个工程都有了这个符号,各个文件都可以调用
这就是变量和函数的区别,变量就是不能用#include 头文件的方法了,c库函数全是函数,可没有c库变量哈。
3 c++引用c 函数
在c++中使用extern,告诉编译器这个用函数用c函数的方式编译,不用c++编译方式编译 (比如编译成isMtMother,不是isMtMother_void.)
定义文件a.c
extern "C" bool isMtMother(void);
bool isMtMother(void)
{
return (CscdMtMgr::getInstance()->getMtMgrMode() == MT_MGR_MOTHER);
}
![](https://img.haomeiwen.com/i1970049/049a31bd5d969cfc.gif)
调用文件b.c
extern bool isMtChild(void);
if (isMtChild()){
......
}
![](https://img.haomeiwen.com/i1970049/82d77d17fd50ccd9.gif)
4 c 调用c++函数
不能直接调用,需要加一层wrapper. 将c++头文件函数,添加extern "c",按照c的方式编译. 然后用wrapper调用c++.
ifdef __cplusplus
extern "C"
{
endif
.....
ifdef __cplusplus
}
endif
参见:https://www.cnblogs.com/lsgxeva/p/11162225.html
http://www.cnblogs.com/renyuan/archive/2012/11/30/2796801.html
网友评论