关于 extern 的有关问题

其实在百度百科上有

现记录下来,一来有个过脑的过程,二来相对更精炼些,再有些自己所想


extern 是关键字,用在c/c++函数中,用来表征外部变量或外部函数

其中在使用extern时要注意:

在实际编程时要严格对应声明时的形式

如果在某个.c文件中要用外部变量,通常在对应的头文件中用extern声明该变量

对于变量来说

extern int a;//声明一个全局变量

int a;//定义一个全局变量

int a = 0;//定义一个全局变量并赋值

extern int a = 0;//定义一个全局变量并赋值

第三第四效果相同;其中声明是不分配空间的也就是不占内存,而定义一个变量就要分配空间相应的也要占用一定的内存,并且定义了一个变量后就不能再次定义

在其它文件中使用的话,就要用extern 声明要用的变量;

编译阶段,全局变量的可见域限制在文件内部,在链接时各个文件的内容被合并到一起,此时在编译完成后,全局变量的可见域扩大到整个程序,这时如果有相同的全局变量名就不可避免的出现多次定义问题

在有多个文件时不要定义相同的全局变量名



函数声明中带有关键字仅仅暗示该函数可能在别的源文件中定义


关于extren "C" 问题


c++语言编译时为解决多态问题,将函数名和参数联合起来形成一个中间变量名,c语言则不会,故c语言不支持重载

所以在一个c++头文件中用extern "C"声明了某个函数如 extren "C" int add(const int &A,const int &b);,在另一个cpp文件实现文件中仅用extren int add(const int &A,const int &B);

声明,就会出现该文件找不到add函数情况;主要前者用c类型声明,而后者用的是c++类型寻找,两者不兼容,所以会找不到。


那么在c++函数中如何调用c函数呢

如有c类型头文件

"cExample.h"

extren int add(int a,int b);

实现

#include"cExample.h"

int add(int a,int b)

{

return a + b;

}

在c++中调用

在对应cpp头文件要用

extren "C"{ //要调用的是add 函数c语言版,用extern "C"是要声明我是c语言版,生成函数名的时候要用c语言的方式

#include"cExample.h"

}

对应函数

int main(void)

{

cout<<add(2,3);

}


在c文件中调用c++函数

cpp头文件 cppExample.h

#ifndef _CPP_EXAMPLE_H_

#define _CPP_EXAMPLE_H_

extern "C" int add(int a,int b);

#endif

在对应的cpp实现中

#include"cppExample.h"

int add(int a, int b)

{

return a + b;

}

在c函数调用中

声明

extern add(int a, int b);

int main(void)

{

printf("%d\n",add(a,b));

return 0;

}

在c函数中用#include"cppExample.h"

出现add 函数未定义,也会有语法错误

可能的原因

c语言不支持extern "C"形式,而cppExample.h头文件中恰恰就是extern "C"定义的所以出现问题

在c函数中直接声明extren对应函数直接调用就好,在此注意。



百度百科在此,详细可看 http://baike.baidu.com/item/extern


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值