C++ extern声明和 定义问题

extern声明的不定义,又有标识和类型。那不定义的是什么?变量?请大侠指教。我没找到“定义”二字的具体意识是什么。

我刚才做了一个实验:
//a.cpp
#include <string>

std::string i;

//b.cpp
#include <iostream>
#include <string>

extern std::string i;

int main ()
{
std::cout << i << std::endl;
}

运行结果为:

(上面是一空行:由于末尾用了endl)

如果没有a.cpp这个文件,运行出错
这是一对实验(有没有a.cpp文件)

可得出这样的结论:
a.cpp中std::string i;是定义(本来就是)
b.cpp中extern std::string i; 则是声明(你的问题)

先别急,这只是实验结果。我们还需要理论依据,那么下面就试着解释一下:

下面是另一个例子(也是第二个实验)
你应该知道内置类型(int等)如果作为全局变量时,定义的同时也就初始化了(一个内置类型有其对应的默认值;如果你将自定义类型也看成内置类型,那么就等于说,一个自定义类型有其对应的默认值(由默认构造函数完成))。如
//c.cpp
int i;

//d.cpp
#include <iostream>

extern int i;

int main ()
{
std::cout << i << std::endl;
}

那么在这里int i; 就是定义(并且初始化了i,初始值为0)
因而输出结果为
0
//这个实验的运行结果符合理论依据。
(我使用的编译器是visual studio 2008)

从这两个实验来看:(将两个“默认”等同起来)
int i;
std::string i;
都可以作为初始化i的定义性语句。
那么
extern int i;
extern std::string i;
也具有定义行为(这个很明显与extern的用法相悖)

在以上两个试验中:int 与 string 有“区别”吗?所有的代码都一样只不过把std::string 换成了 int而已!如果你能解释int的情况,那么我想std::string问题也就迎刃而解了!

于是我个人总结出一个结论:
不论是内置类型还是自定义类型,前面有extern关键字,如果没有显式地初始化参数(即就是自定义类型的默认构造函数被extern屏蔽了,不起初始化的作用),那么就按声明对待。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-11
全局变量的定义只能有一个,但是声明可以有多个,要想引用这个变量,只要包含它的extern声明就行了。所以:*.C文件中变量的定义,在头文件中是变量的extern声明。别的文件要想引用这个变量,就包含这个头文件,就有了这个变量的声明,就可以直接用了。extern告诉编译器,这只是变量的声明,定义在别的地方,编译器就会去别的地方找这个变量,就不会再一次定义这个变量了。
第2个回答  2013-08-11
extern只是声明这里有个变量,在下面的某的地方,我将要用。内存没有给地址给它,如果你定义了,内存就会分配地址,并且也进行了初始化,就是它有了个值。

C++ 声明与定义
1. 声明不一定等同于定义:extern声明并未分配内存空间,因此它不是定义;extern通知编译器变量在其他地方已经被定义。例如:extern int val; \/\/ 仅声明了变量val,没有分配内存空间,因此不是定义。2. 定义也是声明:在定义变量时,同时指出了存储类型,并为变量的存储单元设定了名称,所以也是声明。例...

c++中的extern修饰符在变量的 声明和定义方面有什么作用
6.函数的声明默认是extern的,如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显区别:extern int f(); 和int f(); 当然,这样的用处还是有的,就是在程序中取代include “*.h”来声明函数,在一些复杂的项目中,在所有的...

C++ 语法:C++变量声明和定义的区别
2、另一种是不需要建立存储空间的。 例如:extern int a 其中变量a是在别的文件中定义的。前者是“定义性声明(defining declaration)”或者称为“定义(definition)”,而后者是“引用性声明(referncing declaration)”,从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的...

C++中extern关键字的作用
在C++编程中,extern关键字起着关键作用,它赋予了符号外部链接的属性,使得在多文件编译中实现数据共享。首先,理解变量的声明和定义是基础:声明告知程序变量名和类型,而定义则是分配内存并关联变量。C++允许变量声明和定义分离,通过extern声明而未定义的变量仅在声明文件中可见。extern在C++中的三种用法分...

c++声明和定义有什么区别?
int i; \/\/声明,也是定义 2.如果声明有初始化式,就被当作定义,即使前面加了extern。只有当extern声明位于函数外部时,才可以被初始化。例如:extern double pi=3.1416; \/\/定义 3.函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明。例如:extern double max(double d1,double d...

c++全局变量extern
extern在C++中用作声明变量或函数在其他文件中被定义,帮助编译器在链接时查找定义。在不同文件共享变量和函数定义时,extern确保了代码的可移植性。例如,若文件a.cpp和b.cpp都需要使用全局变量g_var,可在a.cpp中定义g_var,并在b.cpp中使用extern声明g_var,实现文件间变量共享。同样,extern用于...

C++ extern 的问题
extern int g_total;\/\/g_total是一个外部的整型变量这样编译器在编译本代码的时候,并不会立刻定位g_total的实体位置,而是推迟到link阶段去解决实体位置问题。对于函数引用声明,使用extern和不使用,在语法角度上没有本质区别。但是使用extern的函数,其名称信息为保留在生成好的目标文件中,可以被任何第...

C++的一个项目文件,在一个头文件中用extern声明了一个对象,另一个文件...
在1里定义不用写extern 在2里引用要 用extern声明吧!c语言是这样,c++应该也是 你搞反了

请教C++中对象或者变量的声明与定义有何不同??
在定义的时候把函数全部写清楚 已经说了,基本类型变量是声明和定义(初始化)是同时产生的,你的extern int a; 如果是直接这么写的那么就是直接定义和声明,如果是从别的地方extern来得,那么这句话就和声明和定义无关,这样的情况只是说把a扩展成全局来使用,就是实现这个功能,不会重新定义a ...

C语言中的extern的应用,C高手进
extern float a;extern float b;extern 时,也要带类型的,它是声明嘛。 C 语言里面,你要是没有显式的指定类型,默认的就是 int,所以会产生莫名其妙的问题。C\/C++ 中,变量是可以多次声明的,但是只能定义一次。也就是说,声明和定义是不同的概念。当你在一个地方要用它的时候,你可以声明一...

相似回答