c++中的extern修饰符在变量的 声明和定义方面有什么作用 请问C++中使用extern关键字定义变量的意义

C++\u4e2d\u5b9a\u4e49\u53d8\u91cf\u7684\u65f6\u5019\u7528extern\u6709\u4ec0\u4e48\u7528\uff1f

extern:\u8fd9\u662f\u5916\u90e8\u5173\u952e\u5b57\u3002
extern\u53ef\u4ee5\u7f6e\u4e8e\u53d8\u91cf\u6216\u8005\u51fd\u6570\u524d\uff0c\u4ee5\u8868\u793a\u53d8\u91cf\u6216\u8005\u51fd\u6570\u7684\u5b9a\u4e49\u5728\u522b\u7684\u6587\u4ef6\u4e2d\uff0c\u63d0\u793a\u7f16\u8bd1\u5668\u9047\u5230\u6b64\u53d8\u91cf\u548c\u51fd\u6570\u65f6\u5728\u5176\u4ed6\u6a21\u5757\u4e2d\u5bfb\u627e\u5176\u5b9a\u4e49\u3002
\u5982\uff1a\u4f60\u5728\u6587\u4ef6a\u4e2d\u5b9a\u4e49\u4e86int i;
\u4f46\u4f60\u5728\u6587\u4ef6b\u4e2d\u9700\u8981\u7528\u5230\u6587\u4ef6a\u4e2d\u7684\u53d8\u91cfi\uff0c\u8fd9\u65f6\u4f60\u5728\u4f7f\u7528\u53d8\u91cfi\u4e4b\u524d\u5c31\u9700\u8981\u7528extern int i\u6765\u6307\u5b9a\u8bf4\u660e\u8fd9\u662f\u4e00\u4e2a\u5916\u90e8\u53d8\u91cf\uff0c\u8fd9\u65f6\u7f16\u8bd1\u5668\u5c31\u4f1a\u53bb\u5176\u5b83\u6587\u4ef6\u4e2d\u67e5\u627e\u3002(\u6ce8\u610f\uff0c\u8fd9\u4e2a\u5916\u90e8\u53d8\u91cf\u8981\u662f\u5728\u540c\u4e00\u4e2a\u5de5\u7a0b\u4e0b\u7684\u4e0d\u540c\u6587\u4ef6\u4e0b\uff0c\u624d\u80fd\u4f7f\u7528\u3002\u5982\u679c\u662f\u4e0d\u540c\u5de5\u7a0b\u4e2d\u7684\u6587\u4ef6\u5c31\u4e0d\u80fd\u8fd9\u6837\u5f15\u51fa\u6765)\u3002
\u5916\u90e8\u51fd\u6570\u4e5f\u662f\u8fd9\u6837\u6765\u5f15\u7528\u7684\uff0c\u4e0d\u540c\u6587\u4ef6\u4e2d\u7684\u51fd\u6570\u53ef\u4ee5\u4f7f\u7528extern \u5173\u952e\u5b57\u6765\u5f15\u51fa\uff0cC++\u4e2d\u51fd\u6570\u9ed8\u8ba4\u90fd\u662f\u5916\u90e8\u51fd\u6570\uff0c\u540c\u4e00\u4e2a\u5de5\u7a0b\u4e0b\u7684\u4e0d\u540c\u6587\u4ef6\u4e2d\u7684\u51fd\u6570\u4e5f\u4e0d\u80fd\u91cd\u540d\uff0c\u56e0\u4e3aC++\u9ed8\u8ba4\u51fd\u6570\u5b9a\u4e49\u65f6\u662f\u5916\u90e8\u7684\uff0c\u5f53\u7136\u53ef\u4ee5\u5728\u5b9a\u4e49\u65f6\u6539\u4e3a\u5185\u90e8\uff0c\u8fd9\u6837\u591a\u4e2a\u6587\u4ef6\u4e2d\u7684\u51fd\u6570\u5c31\u4e0d\u4f1a\u5f71\u54cd\u3002

\u4f46extern \u8fd8\u6709\u53e6\u4e00\u4e2a\u7528\u5904\uff0c\u90a3\u5c31\u662f\u5148\u4f7f\u7528\u540e\u5b9a\u4e49\u3002\u5982\uff1a\u4f60\u60f3\u4f7f\u7528\u53d8\u91cfi\uff0c\u4f46\u4f60\u4e0d\u77e5\u9053\u8981\u5728\u4ec0\u4e48\u5730\u65b9\u5b9a\u4e49I,\u8fd9\u65f6\u4f60\u5c31\u53ef\u4ee5\u4f7f\u7528extern \u8fd9\u4e2a\u5173\u952e\u5b57\u6765\u8fbe\u5230\u5148\u4f7f\u7528\u53d8\u91cfi\uff0c\u518d\u5b9a\u4e49\u53d8\u91cfi\u7684\u76ee\u7684\u3002

\u5b83\u53ea\u6709\u58f0\u660e\u7684\u610f\u601d\uff0c\u8bf4\u660e\u8fd9\u4e2a\u53d8\u91cf\u5728\u522b\u7684\u5730\u65b9\u5df2\u7ecf\u5b9a\u4e49\u8fc7\u4e86\u3002\u4e00\u822c\u662f\u5168\u5c40\u53d8\u91cf\u624d\u4f1a\u52a0\u8fd9\u4e2a\u58f0\u660e\uff0c\u5f53\u7136\uff0c\u4ed6\u4eec\u662f\u540c\u4e00\u4e2a\u53d8\u91cf\u3002\u5c31\u597d\u6bd41.cpp\u6587\u4ef6\u5b9a\u4e49\u4e86\u4e00\u4e2aint a,
2.cpp\u6587\u4ef6\u4e5f\u5b9a\u4e49\u4e86\u4e00\u4e2a int a\u3002\u8fd9\u6837\u4ed6\u4eec\u5c31\u6709\u53ef\u80fd\u91cd\u590d\u5b9a\u4e49\uff0c\u5982\u679c2.cpp\u4e2d\u52a0\u4e0aextern\u90a3\u4e48\u5c31\u77e5\u90532.cpp\u4e2d\u7684a\u5728\u5176\u4ed6\u5730\u65b9\u5b9a\u4e49\u8fc7\u4e86\uff0c\u548c1.cpp\u662f\u4e00\u4e2a\u53d8\u91cf

在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。

1. extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int
v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在
a.c中声明extern int
v,还取决于变量v本身是能够被引用到的。这涉及到c语言的另外一个话题--变量的作用域。能够被其他模块以extern修饰符引用到的变量通常是全局变
量。还有很重要的一点是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函数fun定义的开头处声明extern int

v,然后就可以引用到变量v了,只不过这样只能在函数fun作用域中引用v罢了,这还是变量作用域的问题。对于这一点来说,很多人使用的时候都心存顾虑。
好像extern声明只能用于文件作用域似的。

2.
extern修饰函数声明。从本质上来讲,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。如果文件a.c需要引用b.c中的函数,比如在
b.c中原型是int fun(int mu),那么就可以在a.c中声明extern int fun(int
mu),然后就能使用fun来做任何事情。就像变量的声明一样,extern int fun(int
mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范围中。对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。使用
extern和包含头文件来引用函数有什么区别呢?extern的引用方式比包含头文件要简洁得多!extern的使用方法是直接了当的,想引用哪个函数
就用extern声明哪个函数。这大概是KISS原则的一种体现吧!这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。

3. 此外,extern修饰符可用于指示C或者C++函数的调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数(只有C++才有extern “C”的用法,在C中这样用会报错)。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。

4.对于extern变量来说,仅仅是一个变量的声明,其并不是在定义分配内存空间。如果该变量定义多次,会有连接错误。extern用在变量声明中常常有这样一个作用,你在*.c文件中定义了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。

5.extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。也就是说c文件里面定义函数和变量,如果该函数或者变量欲开放给外部文件,则在h文件中用extern加以声明。则外部文件只需include该h文件就可以了。而且编译阶段,外部文件是找不到该函数或者变量的,但是不报错。link阶段会从原先模块生成的目标代码中找到此函数和变量。

6.函数的声明默认是extern的,如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显区别:

extern int f(); 和int f(); 当然,这样的用处还是有的,就是在程序中取代include “*.h”来声明函数,在一些复杂的项目中,在所有的函数声明前添加extern修饰是一种比较好的习惯。

如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,只需要包含这个头文件即可。

如果你不想包含头文件,那么在c/cpp中声明该函数。一般来说,声明定义在本文件的函数不用“extern”,声明定义在其他文件中的函数用
“extern”,这样在本文件中调用别的文件定义的函数时就不用包含头文件 include “*.h”来声明函数,声明后直接使用即可。

7.如果在模块A中函数声明了foo(int x,int y)为extern "C"类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。

extern置于变量或者 函数 前面 ,表示该函数或变量在别的文件中定义。
还有其它一些链接作用。
具体可以参考:
http://baike.baidu.com/view/963932.htm

  • extern鍦╟璇█涓槸浠涔堟剰鎬?
    绛旓細鏄竴涓慨楗扮銆傚湪C璇█涓紝淇グ绗xtern鐢ㄥ湪鍙橀噺鎴栬呭嚱鏁扮殑澹版槑鍓嶏紝鐢ㄦ潵璇存槑鈥滄鍙橀噺/鍑芥暟鏄湪鍒瀹氫箟鐨勶紝瑕佸湪姝ゅ寮曠敤鈥銆俥xtern鍙疆浜庡彉閲忔垨鑰呭嚱鏁板墠锛屼互琛ㄧず鍙橀噺鎴栬呭嚱鏁扮殑瀹氫箟鍦ㄥ埆鐨勬枃浠朵腑锛屾彁绀虹紪璇戝櫒閬囧埌姝ゅ彉閲忔垨鍑芥暟鏃讹紝鍦ㄥ叾瀹冩ā鍧椾腑瀵绘壘鍏跺畾涔夈傚彟澶栵紝extern涔熷彲鐢ㄦ潵杩涜閾炬帴鎸囧畾銆傚彲浠ラ氳繃鎶婂師鍑...
  • 鍦C璇█涓ご鏂囦欢鐨別xtern鏄粈涔堟剰鎬濆憿?
    绛旓細鏄竴涓慨楗扮锛屽湪C璇█涓紝淇グ绗xtern鐢ㄥ湪鍙橀噺鎴栬呭嚱鏁扮殑澹版槑鍓嶏紝鐢ㄦ潵璇存槑鈥滄鍙橀噺/鍑芥暟鏄湪鍒瀹氫箟鐨勶紝瑕佸湪姝ゅ寮曠敤鈥銆俥xtern鍙疆浜庡彉閲忔垨鑰呭嚱鏁板墠锛屼互琛ㄧず鍙橀噺鎴栬呭嚱鏁扮殑瀹氫箟鍦ㄥ埆鐨勬枃浠朵腑锛屾彁绀虹紪璇戝櫒閬囧埌姝ゅ彉閲忔垨鍑芥暟鏃讹紝鍦ㄥ叾瀹冩ā鍧椾腑瀵绘壘鍏跺畾涔夈傚彟澶栵紝extern涔熷彲鐢ㄦ潵杩涜閾炬帴鎸囧畾銆傚湪澶存枃浠朵腑澹版槑...
  • extern鐨勮瑙
    绛旓細extern鐨勮瑙o細extern鏄c璇█涓殑涓涓叧閿瓧锛屼竴鑸敤鍦ㄥ彉閲忓悕鍓嶆垨鍑芥暟鍚嶅墠锛屼綔鐢ㄦ槸鐢ㄦ潵璇存槑姝ゅ彉閲/鍑芥暟鏄湪鍒瀹氫箟鐨勶紝瑕佸湪姝ゅ寮曠敤銆傚鏋滃湪鎵鏈夊嚱鏁颁箣澶栧畾涔夌殑鍙橀噺娌℃湁鎸囧畾鍏跺瓨鍌ㄧ被鍒紝閭d箞瀹冨氨鏄竴涓閮ㄥ彉閲忥紝瀹冪殑浣滅敤鍩熸槸浠庡畠鐨勫畾涔夌偣鍒版湰鏂囦欢鐨勬湯灏俱傚湪鍗曚釜婧愭枃浠朵腑鐨勭‘鏄繖鏍凤紝濡傛灉鏈夊涓簮鏂囦欢...
  • externc鐢ㄦ硶
    绛旓細绛旓細鍦–璇█涓紝"externc"鏄竴绉嶉摼鎺ヤ慨楗扮锛岀敤浜庡0鏄庝竴涓彉閲忔垨鍑芥暟鍦ㄥ埆鐨勬枃浠朵腑瀛樺湪锛屼絾鍦ㄨ繖涓枃浠朵腑浣跨敤銆傚畠鍛婅瘔缂栬瘧鍣ㄥ湪鍏朵粬鍦版柟鏌ユ壘杩欎釜鍙橀噺鎴栧嚱鏁扮殑瀹氫箟銆傝繖绉嶇敤娉曢氬父鐢ㄤ簬妯″潡鍖栫紪绋嬶紝浣垮緱浠g爜鏇存槗浜庣淮鎶ゅ拰澶嶇敤銆傞渶瑕佹敞鎰忕殑鏄紝"externc"浠呯敤浜庡湪鍚屼竴缂栬瘧鍗曞厓鍐呯殑澶栭儴閾炬帴锛屼篃灏辨槸璇达紝鍦ㄥ悓涓缂栬瘧...
  • C鐨勪慨楗扮鏈夊摢浜
    绛旓細extern锛淇グ绗锛氫慨楗板彉閲忥紝鍑芥暟銆備慨楗板彉閲忔椂鍊欙紝鍙橀噺鐨勫0鏄庡湪澶栭潰锛屼慨楗板嚱鏁扮殑鏃跺欙紝濡傛灉鍑芥暟宸茬粡澹版槑锛屽垯浣滅敤涓嶆槸寰堝ぇ銆俢onst锛氫慨楗扮锛氫慨楗板彉閲忥紝鍑芥暟銆備慨楗板彉閲忔椂鍊欙紝涓嶈兘琚噸澶嶈祴鍊硷紝鍙兘鏀惧湪鍙娈典腑銆備慨楗板嚱鏁版椂鍊欙紝琛ㄦ槑鍑芥暟鐨勮繑鍥炲煎繀椤讳负甯告暟銆倂olatile锛氾紙宓屽叆寮忕▼搴忓憳蹇呴』鎺屾彙鐨勶級volatile鏈鍒濈殑鎰忔...
  • 鍦c璇█涓慨楗扮鐨勭敤娉
    绛旓細绫诲瀷淇グ绗︼細瀵瑰唴瀛樿祫婧愬瓨鏀句綅缃殑闄愬畾銆傚叧閿瓧锛歛uto銆乺egister銆乻tatic銆乧onst銆extern銆乿olatile銆1銆乤uto锛氶粯璁ゅ疄鐜扮殑锛宎uto int a锛涢粯璁ゅ垎閰嶇殑鍐呭瓨鍖哄煙閮芥槸鍙鍙啓鐨勫尯鍩熴2銆乺egister锛氶檺鍒跺彉閲忓畾涔夊湪瀵勫瓨鍣ㄤ笂鐨勪慨楗扮锛孋PU涓婄殑瀵勫瓨鍣紝璇诲彇閫熷害蹇3銆乻tatic锛氶潤鎬佷慨楗扮锛屼慨楗板嚱鏁板唴閮ㄧ殑鍙橀噺銆佸嚱鏁板...
  • C璇█涓彉閲忓瓨鍌╯tatic鍜extern涓や釜鍏抽敭瀛楃殑浣滅敤鍒嗗埆鏄粈涔
    绛旓細鍦–璇█涓紝淇グ绗xtern鐢ㄥ湪鍙橀噺鎴栬呭嚱鏁扮殑澹版槑鍓锛岀敤鏉ヨ鏄庘滄鍙橀噺/鍑芥暟鏄湪鍒瀹氫箟鐨勶紝瑕佸湪姝ゅ寮曠敤鈥濄傚湪涓婇潰鐨勪緥瀛愪腑鍙互鐪嬪嚭锛屽湪file2涓鏋滄兂璋冪敤file1涓殑鍙橀噺a锛屽彧椤荤敤extern杩涜澹版槑鍗冲彲璋冪敤a锛岃繖灏辨槸extern鐨勪綔鐢ㄣ傚湪杩欓噷瑕佹敞鎰廵xtern澹版槑鐨勪綅缃鍏朵綔鐢ㄥ煙涔熸湁鍏崇郴锛屽鏋滄槸鍦╩ain鍑芥暟涓繘琛...
  • c涓鍏ㄥ眬鍙橀噺鐨勪慨楗扮鏄粈涔?
    绛旓細c榛樿灏辨槸鍏ㄥ眬鍙橀噺锛屼笉鐢淇グ绗鎴栬呭叧閿瓧銆傚澶栭儴鏂囦欢闇瑕佸寘鎷殑锛屽彲浠ョ敤extern鍦header鏂囦欢閲岋紝瀹炰綋鍦╟/cpp/cc鏂囦欢閲屻
  • 濡備綍鍦∕DK涓娇鐢–++,鏁寸悊鐨勭粡楠
    绛旓細1锛氬湪C澶存枃浠朵腑鍔犱笂extern淇グ绗锛1. #ifdef __cplusplus 2. extern "C" { 3. #endif 4.5.6. 銆傘傘傝繖閲屽啓c璇█浠g爜 7.8.9. #ifdef __cplusplus 10. } 11. #endif 杩欐牱鍦ㄤ娇鐢–++璋冪敤鏃跺氨浣跨敤C++缂栬瘧鍣ㄧ紪璇戯紝c璇█璋冪敤鏃跺氨鏄敤c璇█鏂瑰紡缂栬瘧 2锛氱紪鍐欎竴涓狢++椋庢牸鐨勫ご鏂囦欢锛...
  • c璇█涓殑淇グ绗鏈変粈涔堢敤?
    绛旓細淇グ绗 鏍煎紡璇存槑銆佹剰涔 M %md 浠ュ搴杈撳嚭鏁村瀷鏁帮紝涓嶈冻m鏃讹紝宸﹁ˉ绌烘牸 0m %0md 浠ュ搴杈撳嚭鏁村瀷鏁帮紝涓嶈冻m鏃讹紝宸﹁ˉ闆 m,n %m.nf 浠ュ搴杈撳嚭瀹炲瀷灏忔暟锛屽皬鏁颁綅涓簄浣 渚嬪锛氳i = 123锛宎 = 12.34567锛屽垯锛歱rintf("%4d +++ %5.2f"锛宨锛宎);杈撳嚭锛 123 +++ 12.35 printf("%2d +...
  • 扩展阅读:c++编程器手机版下载 ... extern c++用法 ... c++中<< ... c++和python先学哪个 ... 手机c++编程软件 ... c++教程 ... c++编程入门自学 ... extern用法举例 ... c++编译器app下载 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网