extern详解

目录

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);
}

调用文件b.c

extern bool isMtChild(void);
if (isMtChild()){
    ......
}

4 c 调用c++函数

不能直接调用,需要加一层wrapper. 将c++头文件函数,添加extern "c",按照c的方式编译. 然后用wrapper调用c++.

#ifdef __cplusplus
extern "C"
{
#endif
.....
#ifdef __cplusplus

}
#endif

参见:C调用C++(C++封装以及C对其调用) - lsgxeva - 博客园

extern使用方法总结 - 任智康 - 博客园

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值