为什么我在C++中的头文件中,类A下声明一下变量extern int test;会提示我A::test非法的存储类?? 请教!

个人感觉C++中extern作用不大吧,其他文件想引用时,直接包括头文件就行了吧,不需要再声明为extern了、在C中作用还是有的、、

我刚才做了一个实验:<br>//a.cpp <br>#include <string><br><br>std::string i;<br><br>//b.cpp<br>#include <iostream><br>#include <string><br><br>extern std::string i;<br><br>int main ()<br>{<br>std::cout << i << std::endl;<br>}<br><br>运行结果为:<br><br>(上面是一空行:由于末尾用了endl)<br><br>如果没有a.cpp这个文件,运行出错<br>这是一对实验(有没有a.cpp文件)<br><br>可得出这样的结论:<br>a.cpp中std::string i;是定义(本来就是)<br>b.cpp中extern std::string i; 则是声明(你的问题)<br><br>先别急,这只是实验结果。我们还需要理论依据,那么下面就试着解释一下:<br><br>下面是另一个例子(也是第二个实验)<br>你应该知道内置类型(int等)如果作为全局变量时,定义的同时也就初始化了(一个内置类型有其对应的默认值;如果你将自定义类型也看成内置类型,那么就等于说,一个自定义类型有其对应的默认值(由默认构造函数完成))。如<br>//c.cpp<br>int i;<br><br>//d.cpp<br>#include <iostream><br><br>extern int i;<br><br>int main ()<br>{<br>std::cout << i << std::endl;<br>}<br><br>那么在这里int i; 就是定义(并且初始化了i,初始值为0)<br>因而输出结果为<br>0<br>//这个实验的运行结果符合理论依据。<br>(我使用的编译器是visual studio 2008)<br><br><br>从这两个实验来看:(将两个“默认”等同起来)<br>int i;<br>std::string i;<br>都可以作为初始化i的定义性语句。<br>那么<br>extern int i;<br>extern std::string i; <br>也具有定义行为(这个很明显与extern的用法相悖)<br><br>在以上两个试验中:int 与 string 有“区别”吗?所有的代码都一样只不过把std::string 换成了 int而已!如果你能解释int的情况,那么我想std::string问题也就迎刃而解了!<br><br>于是我个人总结出一个结论:<br>    不论是内置类型还是自定义类型,前面有extern关键字,如果没有显式地初始化参数(即就是自定义类型的默认构造函数被extern屏蔽了,不起初始化的作用),那么就按声明对待。<br> 麻烦采纳·····
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-04
个人感觉你搞不懂extern是干啥用的
在C里有什么用在c++里就有什么用
第2个回答  2011-08-04
test不是全局变量本回答被提问者采纳

...int test;会提示我A::test非法的存储类?? 请教!
运行出错<br>这是一对实验(有没有a.cpp文件)<br><br>可得出这样的结论:<br>a.cpp中std::string i;是定义(本来就是)<br>b.cpp中extern std::string i; 则是声明(你的问题)<br><br>先别急,这只是实验结果。我们还需要理论依据,那么下面就试着解释一下:<br><br>下面是另一个...

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

怎样理解extern,const,static的含义和他们之间的关系?
因为在c++里变量只能定义一次。这样做的好处是在其他文件里面可以使用,但此时必须申明它。如:在a文件中声明了 extern int i;在b文件中可以直接使用这个变量,此时可以声明extern int i 告诉编译器这个变量在其他文件中已经声明了。我们平时往往把声明和定义混淆了。往往都是在声明的时候就定义了,这只...

c++在进行c编译时,为什么要声明extent c
具体我也不清楚,由于c和c++对函数的处理方式不同的话,你在c++写函数要让c语言可以调用,那么就要加个东西表示要按c的方式编译函数,这就是加个extern "c"了,在c++语言里面使用c方式的函数,声明的时候也要加上extern "c"告诉编译器按c的方式去查找这个函数,否则的话可能会出现链接错误,具体的...

C++ undeclared identifier问题
引用其他文件里变量时.用 extern 关键字。比如 在一个文件定义 int a;在另一个文件,包括了上个文件,然后用 extern int a;

c中库函数中的头文件为什么在声明函数的时候前面都加"extern"?
C函数前加extern表示该函数已经在其他文件中定义。extern是C,C++中的一个关键字。extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定。

c++ 中如何声明一个 int 变量
但是将会使用,请分配【不仅指分配内存,还包括在维护表中生成类体等】)。所以 C++ 中的声明int 变量差不多(其他方式恕我才疏学浅)只有一种,那就是非本文件的成员,或是说,声明部分前面已经有对该变量的引用。可以使用 extern 关键字声明一下。(作用只是告诉编译器,关于此变量不要报错)...

c++中 用extern声明外部变量时能不能给变量赋初值
只不过出于简单的目的,函数的声明省略了extern关键字,函数不能再声明(除非是定义)处定义函数体。我们通常的变量声明主要是声明变量的类型(编译器认为是分配内存的方式):int variable;这已经有足够的信息令编译器(在声明的地方)分配内存。希望可以帮到你 参考资料:《thinking in C++》...

c++中的extern修饰符在变量的 声明和定义方面有什么作用
好像extern声明只能用于文件作用域似的。2.extern修饰函数声明。从本质上来讲,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。如果文件a.c需要引用b.c中的函数,比如在 b.c中原型是int fun(int mu),那么就可以在a.c中声明extern int fun(int mu),然后就能使用fun来做任何事情。

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

相似回答