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

个人感觉C++中extern作用不大吧,其他文件想引用时,直接包括头文件就行了吧,不需要再声明为extern了、在C中作用还是有的、、... 个人感觉C++中extern作用不大吧,其他文件想引用时,直接包括头文件就行了吧,不需要再声明为extern了、在C中作用还是有的、、 展开
 我来答
匿名用户
2011-08-04
展开全部
我刚才做了一个实验:<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> 麻烦采纳·····
vbtraz
2011-08-04 · TA获得超过5532个赞
知道大有可为答主
回答量:4152
采纳率:0%
帮助的人:4452万
展开全部
个人感觉你搞不懂extern是干啥用的
在C里有什么用在c++里就有什么用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友aebc321
2011-08-04 · TA获得超过523个赞
知道小有建树答主
回答量:469
采纳率:95%
帮助的人:185万
展开全部
test不是全局变量
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式