linux c 一站式学习 extern关键词作用、变量的声明与定义以及extern与include的区别(都与extern有关)

       extern的大致有两个作用,就是后面加不加C。
一,后面加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关系
    两个疑惑,有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/



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章