首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

iostream中的extern对象解决方法

2012-05-01 
iostream中的extern对象C/C++ codeiostream中的对象用extern是多余????以下是vs2010中的代码用了extern修

iostream中的extern对象

C/C++ code
iostream中的对象用extern是多余????以下是vs2010中的代码用了extern修饰。。。。。感觉多余, 原因:使用者包含了iostream了,包含了这个头文件,就没有必要用extern了。。。。extern的正确用法为:同一个工程下,一个头文件中定义了一个变量,然后其他文件用extern 重新声明即可使用了。。。。。// iostream standard header for Microsoft#pragma once#ifndef _IOSTREAM_#define _IOSTREAM_#ifndef RC_INVOKED#include <istream> #pragma pack(push,_CRT_PACKING) #pragma warning(push,3)_STD_BEGIN  #ifdef _M_CEE_PURE__PURE_APPDOMAIN_GLOBAL extern istream cin, *_Ptr_cin;__PURE_APPDOMAIN_GLOBAL extern ostream cout, *_Ptr_cout;__PURE_APPDOMAIN_GLOBAL extern ostream cerr, *_Ptr_cerr;__PURE_APPDOMAIN_GLOBAL extern ostream clog, *_Ptr_clog;__PURE_APPDOMAIN_GLOBAL extern wistream wcin, *_Ptr_wcin;__PURE_APPDOMAIN_GLOBAL extern wostream wcout, *_Ptr_wcout;__PURE_APPDOMAIN_GLOBAL extern wostream wcerr, *_Ptr_wcerr;__PURE_APPDOMAIN_GLOBAL extern wostream wclog, *_Ptr_wclog;  #else /* _M_CEE_PURE */        // OBJECTS__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 istream cin, *_Ptr_cin;__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 ostream cout, *_Ptr_cout;__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 ostream cerr, *_Ptr_cerr;__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 ostream clog, *_Ptr_clog;__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 wistream wcin, *_Ptr_wcin;__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 wostream wcout, *_Ptr_wcout;__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 wostream wcerr, *_Ptr_wcerr;__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 wostream wclog, *_Ptr_wclog;        // CLASS _Winitclass _CRTIMP2_PURE _Winit {public:    __thiscall _Winit();    __thiscall ~_Winit();private:    __PURE_APPDOMAIN_GLOBAL static int _Init_cnt;    };  #endif /* _M_CEE_PURE */_STD_END #pragma warning(pop) #pragma pack(pop)#endif /* RC_INVOKED */#endif /* _IOSTREAM_ *//* * Copyright (c) 1992-2009 by P.J. Plauger.  ALL RIGHTS RESERVED. * Consult your license regarding permissions and restrictions.V5.20:0009 */


[解决办法]
我想楼主是误解了extern的用途了。extern有两重含义,分别在编译期和连接期起作用。

在编译期,extern的含义是告诉编译器:有一个如后声明的变量被定义在某处(具体位置不予说明),你老编不用管它在哪里了,反正我保证它一定存在。然后,编译器就可以接受对该变量的使用,并在编译出的代码里处理它。但这些代码里并不会给该变量分配空间,只是标明它是"extern"的。

在连接期,extern的含义则是告诉连接器:我这里使用了一个不是自己定义的变量,老兄你得把它找出来并且让我的代码可以使用这个变量。那么这时连接器会干什么呢?它会在你指定的范围里到处寻找这个变量的具体定义,找到这麻烦的家伙被真正分配的存储空间,然后让所有通过extern声明使用它的家伙都得到这个空间的地址,从而能够真正的使用到它。

以前我们通常都会先做编译操作然后再将编译好的模块连接起来。这是非常明确的两步操作,所以大家理解这个问题很容易。而现在,IDE和cl一类东西横行,好多新手都不知道编译和连接其实是两个过程,就很难理解这些了。

还需要特别指出的是:extern只能用在全局变量上,用在局部变量上是不具备意义的。因为局部变量在函数外都不再存在,更别说是在另一个文件里了。

extern的使用要点:
1、必须有一个文件里给出了extern变量的具体定义——是定义不是声明,定义是不带extern的。
2、必须是个全局变量定义。
3、有包含关系的其它文件里必须没有该定义,最多也只能有声明——带extern的声明。
4、在IDE的管理下,很多情况下我们都能省掉extern声明。因为,包含的头文件已经让编译器能够找到具体的它在何处被定义,而IDE在编译时绝不会出现我们手工编译时出现的打漏需编译文件的问题。当我们打漏时,extern声明有可能使得编译继续执行下去,而没有extern声明的话就会出错。

热点排行