extern有什么作用?(这贴,婉辞lovesmiles大师回贴!)
extern有什么作用?(这贴,谢绝lovesmiles大师回贴!)
《C++Primer》第四版
2.3.5 声明和定义
声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern关键字声明变量名而不定义它。不定义变量的声明包括对象名,对象类型和对象类型前的关键字extern。
-------------
2.4 const限定符
2 const对象默认为文件的局部变量
通过指定const变量为extern,就可以在整个程序中访问const。
---------------
问题:
1.上面引用的第一句话,是什么意思?
2.上面这引用的两句话,关键字extern,作用相同么?
3.关键字extern,有多少种作用?
------解决方案--------------------
1.extern告诉编译器,在别处可能有这个名称的具体定义,如果没有那么这个名称的具体定义,名称将不会参与编译。
2.个人认为不一样,第一个说的是引用可能在别处,而第二个则是将const的默认的局部变量的访问范围扩展至整个程序。
------解决方案--------------------
就变量来说,extern是声明全局变量,不带extern才是定义全局变量,一个全局变量在一个程序里只能定义一次,可以在多个编译单元(一个.c/.cpp)文件里extern声明。
------解决方案--------------------
1) 外部变量,包括数组
extern int x;
extern int x[];
2)外部函数
extern void fun(){}
3)外部常(变)量 extern const int x; //
4)C,或者 C++ 式样函数和数据,或者他们的集合----批量的C,或者 C++ 式样函数和数据。------
//extern "C",extern "C++"
extern "C"void fun(){}
extern "C++"void fun(){}
extern "C"{
void fun(){}
.......................
}
extern "C++"{
void fun(){}
...............................
}
5)*extern template
C++11:C++11将会引入外部模板这一概念。C++已经有了强制编译器在特定位置开始实例化的语法:
template class std::vector<MyClass>;
而C++所缺乏的是阻止编译器在某个编译单元内实例化模板的能力。C++11将简单地扩充前文语法如下:
extern template class std::vector<MyClass>;
这样就告诉编译器不要在该编译单元内将该模板实例化。
6)************* 居然还有 extern inline ..............还可以这么搞??????????????
这不是标准吧????
------解决方案--------------------
PS :
外部函数,外部变量,是在函数里面用的,和定义的文件,没有关系,只需要有定义(并且一致)。
哪段代码,调用的函数里用着了,哪段代码,就可以修改变量的值了。
并不是非要定义处,才能使用,局部变量,才是只能在定义处使用。
外部变量,到链接,才能最终确定有没有定义,编译的时候不一定能够确定。
编译的时候,也许已经定义了,没有定义也没关系,因为已经用extern 说明了。
函数缺省就是外部的,只要有个声明,就好,链接的时候,没有定义的函数,才会确定是一个错误。
C 语言中:
函数,变量的extern 声明,就是相当于,声明一个占位符;
表示这个变量,或者函数,在本文件(.c),或者其他文件(.c)的某个地方,已经定义了。
凡是引用这个函数,变量的地方,如果编译的时候,没有找到定义,那就暂时先占着,----比如填入0;
也许会在一个表里做个标记,等到找到定义的时候,一般是链接的时候,链接进去,---用函数,变量的替换掉占位符。
《C++Primer》第四版
2.3.5 声明和定义
声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern关键字声明变量名而不定义它。不定义变量的声明包括对象名,对象类型和对象类型前的关键字extern。
-------------
2.4 const限定符
2 const对象默认为文件的局部变量
通过指定const变量为extern,就可以在整个程序中访问const。
---------------
问题:
1.上面引用的第一句话,是什么意思?
2.上面这引用的两句话,关键字extern,作用相同么?
3.关键字extern,有多少种作用?
------解决方案--------------------
1.extern告诉编译器,在别处可能有这个名称的具体定义,如果没有那么这个名称的具体定义,名称将不会参与编译。
2.个人认为不一样,第一个说的是引用可能在别处,而第二个则是将const的默认的局部变量的访问范围扩展至整个程序。
------解决方案--------------------
就变量来说,extern是声明全局变量,不带extern才是定义全局变量,一个全局变量在一个程序里只能定义一次,可以在多个编译单元(一个.c/.cpp)文件里extern声明。
------解决方案--------------------
1) 外部变量,包括数组
extern int x;
extern int x[];
2)外部函数
extern void fun(){}
3)外部常(变)量 extern const int x; //
4)C,或者 C++ 式样函数和数据,或者他们的集合----批量的C,或者 C++ 式样函数和数据。------
//extern "C",extern "C++"
extern "C"void fun(){}
extern "C++"void fun(){}
extern "C"{
void fun(){}
.......................
}
extern "C++"{
void fun(){}
...............................
}
5)*extern template
C++11:C++11将会引入外部模板这一概念。C++已经有了强制编译器在特定位置开始实例化的语法:
template class std::vector<MyClass>;
而C++所缺乏的是阻止编译器在某个编译单元内实例化模板的能力。C++11将简单地扩充前文语法如下:
extern template class std::vector<MyClass>;
这样就告诉编译器不要在该编译单元内将该模板实例化。
6)************* 居然还有 extern inline ..............还可以这么搞??????????????
这不是标准吧????
------解决方案--------------------
//A.c
#include<stdio.h>
int x = 0;
int initX(int n){
printf("A.c InitX:Old x = %d\n",x);
x = n;
printf("A.c InitX:New x = %d\n",x);
}
//B.c
extern int x;
int SetX(int n){
printf("B.c SetX:Old x = %d\n",x);
x =n;
printf("B.c SetX:Old x = %d\n",x);
}
//C.c
extern int x;
int ResetX(int n){
printf("c.c ResetX :Old x = %d\n",x);
x =n;
printf("c.c ResetX :New x = %d\n",x);
}
//d.c
// 这三个函数 ,前面写上 extern 和不写,作用相同。
void init\X(int n); //
void SetX(int n); //
void ResetX(int n); //
int main(){
Init(10);
SetX(100);
ResetX(1000);
return 0;
}
PS :
外部函数,外部变量,是在函数里面用的,和定义的文件,没有关系,只需要有定义(并且一致)。
哪段代码,调用的函数里用着了,哪段代码,就可以修改变量的值了。
并不是非要定义处,才能使用,局部变量,才是只能在定义处使用。
外部变量,到链接,才能最终确定有没有定义,编译的时候不一定能够确定。
编译的时候,也许已经定义了,没有定义也没关系,因为已经用extern 说明了。
函数缺省就是外部的,只要有个声明,就好,链接的时候,没有定义的函数,才会确定是一个错误。
C 语言中:
函数,变量的extern 声明,就是相当于,声明一个占位符;
表示这个变量,或者函数,在本文件(.c),或者其他文件(.c)的某个地方,已经定义了。
凡是引用这个函数,变量的地方,如果编译的时候,没有找到定义,那就暂时先占着,----比如填入0;
也许会在一个表里做个标记,等到找到定义的时候,一般是链接的时候,链接进去,---用函数,变量的替换掉占位符。