其实在百度百科上有
现记录下来,一来有个过脑的过程,二来相对更精炼些,再有些自己所想
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