一,后面加C 如: extern "C" void fun(int a, int b);就是告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非。
二,不加C修饰变量和函数 如extern int g_Int;就是声明的这个变量或函数在在其他文件中可见,(隐含的一层意思是定义在其他地方)
变量的声明与定义
1.定义也是声明,extern声明不是定义,即不分配存储空间。extern告诉编译器变量在其他地方定义了。
例如:extern int i; //声明,不是定义
int i; //定义
2.如果声明有初始化式,就被当作定义,即使前面加了extern。只有当extern声明位于函数外部时,才可以被初始化。
例如:extern double pi=3.1416; //定义
3.函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明。
例如:extern double max(double d1,double d2); //声明
4.除非有extern关键字,否则都是变量的定义。
例如:extern int i; //声明
int i; //定义
另外:
void main() { extern int a;//定义和声明不能放在同一个函数里 int a=10; //再定义a=10错误 cout<<hex<<&a<<endl; }
void main() { extern int a=10;//在函数体内声明不能被初始化 cout<<a<<endl;//这是一个错误的表达式 }
extern int a;//说明声明可以声明多次,而定义却只能定义一次 extern int a; extern int a; void main() { int a=10; cout<<a<<endl; }
两 个疑惑,有extern声明外部变量或函数,还需要include做什么。再者,我们知道预编译器只是把include头文件部分进行相应展开,那么头文件中声明int a,需不需要前面加extern。
问题一个一个来。
第一个问题,有点像零售和批发的意思。
第二个问题
这个extern有个身份mmp的地方,日了狗, 在定义变量的时候,这个extern居然可以被省略(定义时,默认均省略);在声明变量的时候,这个extern必须添加在变量前,所以有时会让你搞不清楚到底是声明还是定义。或者说,变量前有extern不一定就是声明,而变量前无extern就只能是定义。注:定义要为变量分配内存空间;而声明不需要为变量分配内存空间。
例如,每个源文件中包含一个头文件,这个头文件中有a的定义int a;每个源文件在单独编译时不会出错,但是连接时会出出现重复定义的错误。
对于函数来说 也一样,也是定义和声明,定义的时候用extern,说明这个函数是可以被外部引用的,声明的时候用extern说明这是一个声明。 但由于函数的定义和声明是有区别的,定义函数要有函数体,声明函数没有函数体(还有以分号结尾),所以函数定义和声明时都可以将extern省略掉,反正其他文件也是知道这个函数是在其他地方定义的,所以不加extern也行。两者如此不同,所以省略了extern也不会有问题。
总结:
对变量而言,如果你想在本源文件(例如文件名A)中使用另一个源文件(例如文件名B)的变量,方法有2种:
(1)在A文件中必须用extern声明在B文件中定义的变量(当然是全局变量);
(2)在A文件中添加B文件对应的头文件,当然这个头文件包含B文件中的变量声明,也即在这个头文件中必
须用extern声明该变量,否则,该变量又被定义一次。
对函数而言,如果你想在本源文件(例如文件名A)中使用另一个源文件(例如文件名B)的函数,方法有2种:
(1)在A文件中用extern声明在B文件中定义的函数(其实,也可省略extern,只需在A文件中出现B文件定义
函数原型即可);
(2)在A文件中添加B文件对应的头文件,当然这个头文件包含B文件中的函数原型,在头文件中函数可以
不用加extern。
转自:http://lpy999.blog.163.com/blog/static/117372061201182051413310/