extern关键字对函数和变量的区别

extern 关键字适用于C变量(数据结构)和C函数。根本上来说,extern关键字扩展了C变量和C函数的可见性。这可能就是它被命名为extern的原因。
虽然大多数人可能理解变量或函数的“声明”和“定义”之间的区别,但为了完整起见,还是区分一下它们。

变量或函数可以 声明任意多次 ,但只能 定义一次 。(记住一个基本原则,即同一个变量或函数不能有两个位置)。
现在回到关键字 extern 。首先,我们考虑一下 extern 在函数中的使用。事实上,在声明或定义 函数 时,会隐式地假定 extern 关键字。当我们写:

编译器会将其视为:

由于 extern 关键字将函数的可见性扩展到了整个程序,因此可以在整个程序(项目)的任何文件中使用(调用)函数,只要这些文件包含了函数的声明。(函数声明就绪后,编译器就知道函数的定义存在于其他地方,然后继续编译文件)。这就是关于extern和函数的所有内容。

现在我们考虑extern和变量的使用。首先,如何在不定义变量的情况下声明变量?你可以这样做:

这里声明了一个名为 var 的整型变量(但是还没有定义它,所以到目前为止还没有为var分配内存)。我们想做多少次声明都可以。
如何定义var呢?你可以这样做:

在这一行中,一个名为var的整型变量被 声明和定义 (请记住定义是声明的超集)。因为这是一个定义,所以也为var分配了内存。
所以,区别来了。当我们声明/定义一个函数时,我们看到extern关键字隐式地出现了。但这不是变量的情况。想一下如果是,则永远不会为它们分配内存(后面针对var的内容都是使用它了)。因此,当我们希望 声明变量而不定义它们 时,需要显式地包含extern关键字。此外,由于extern关键字扩展了整个程序的可见性,通过在变量中使用extern关键字,只要包含了变量的声明(该变量在某一处定义),就可以在当前程序中的任何地方使用该变量。
现在我们用例子来理解extern。
示例1:

该程序会编译成功。var是全局定义(和隐式声明)的。
示例2:

该程序会编译成功。这里只声明var。但var从未使用过,所以不会出现问题。
示例3:

这个程序在编译时会抛出一个错误(链接错误),因为var没有在任何地方定义。实际上,var没有被分配任何内存,但程序试图将一个根本不存在的变量的值改为10。
示例4:

假设somefile.h包含var的定义,这个程序将成功编译。
例5:

你认为这个程序会编译成功吗?

这是C语言标准中的一个内容,如果一个变量只是被声明并且同时又被初始化了,那么该变量的内存也将被分配——换句话说,该变量将被认为是已定义的。因此,按照C语言标准,这个程序可以顺利编译并正常执行。
这就是C中extern关键字的一些补充介绍。
简单总结:



  • C璇█涓鍙橀噺瀛樺偍static鍜extern涓や釜鍏抽敭瀛鐨勪綔鐢ㄥ垎鍒槸浠涔
    绛旓細閭d箞鍦╢ile2.c鏄棤娉曡闂埌鍙橀噺a鐨勩傚師鍥犲湪浜庣敤static瀵瑰叏灞鍙橀噺杩涜淇グ鏀瑰彉浜嗗叾浣滅敤鍩熺殑鑼冨洿锛岀敱鍘熸潵鐨勬暣涓伐绋嬪彲瑙佸彉涓烘湰婧愭枃浠跺彲瑙併(3)淇グ鍑芥暟 鐢╯tatic淇グ鍑芥暟鐨勮瘽锛屾儏鍐典笌淇グ鍏ㄥ眬鍙橀噺澶у悓灏忓紓锛屽氨鏄敼鍙樹簡鍑芥暟鐨勪綔鐢ㄥ煙銆extern鍏抽敭瀛 鍦–璇█涓紝淇グ绗xtern鐢ㄥ湪鍙橀噺鎴栬呭嚱鏁扮殑澹版槑鍓嶏紝鐢ㄦ潵璇存槑...
  • extern杩欎釜鍑芥暟鐨勭敤娉
    绛旓細extern "C"{ endif endif /* __cplusplus */ 鈥︹//.h鏂囦欢缁撴潫鐨勫湴鏂 ifdef __cplusplus if __cplusplus } endif endif /* __cplusplus */ </SPAN>3 闂锛歟xtern 鍑芥暟1 甯稿父瑙乪xtern鏀惧湪鍑芥暟鐨勫墠闈㈡垚涓哄嚱鏁板0鏄庣殑涓閮ㄥ垎锛岄偅涔堬紝C璇█鐨鍏抽敭瀛梕xtern鍦ㄥ嚱鏁扮殑澹版槑涓捣浠涔堜綔鐢紵绛旀涓庡垎鏋愶細濡...
  • 瑕佸畾涔変竴涓眬閮鍙橀噺,搴斾娇鐢ㄧ殑鍏抽敭瀛鏄粈涔
    绛旓細闈欐佺殑鍙橀噺鍜屽嚱鏁鐨勭敓鍛介兘鐢╯tatic鍏抽敭瀛, 鐢熷懡鍦ㄥ彟涓涓枃浠朵腑瀹氫箟鐨勫彉閲忕敤extern鍏抽敭瀛銆傚鏋澶栭儴鍙橀噺涓嶅湪鏂囦欢鐨勫紑澶村畾涔夛紝鍏舵湁鏁堢殑浣滅敤鑼冨洿鍙兘浠庡畾涔夌偣鍒版枃浠剁粨鏉熴傚鏋滃湪瀹氫箟鐐逛箣鍓嶇殑鍑芥暟鎯冲紩鐢ㄨ澶栭儴鍙橀噺锛屽垯搴旇鍦ㄥ簲鐢ㄤ箣鍓嶇敤鍏抽敭瀛梕xtern瀵璇ュ彉閲忎綔鈥樺閮ㄥ彉閲忓0鏄庘欍傝〃绀鸿鍙橀噺鏄竴涓凡缁忓畾涔変簡鐨勫閮...
  • C鍑芥暟鍓嶅姞extern鏄粈涔堟剰鎬?
    绛旓細C鍑芥暟鍓嶅姞extern琛ㄧず璇ュ嚱鏁板凡缁忓湪鍏朵粬鏂囦欢涓畾涔夈俥xtern鐨勫畾涔夛細extern鏄疌锛孋++涓殑涓涓鍏抽敭瀛銆俥xtern鍙疆浜鍙橀噺鎴栬呭嚱鏁板墠锛屼互琛ㄧず鍙橀噺鎴栬呭嚱鏁扮殑瀹氫箟鍦ㄥ埆鐨勬枃浠朵腑锛屾彁绀虹紪璇戝櫒閬囧埌姝ゅ彉閲忔垨鍑芥暟鏃讹紝鍦ㄥ叾瀹冩ā鍧椾腑瀵绘壘鍏跺畾涔夈傚彟澶栵紝extern涔熷彲鐢ㄦ潵杩涜閾炬帴鎸囧畾銆
  • c++涓殑external function浠涔堟剰鎬
    绛旓細extern "C"鐨勫惈涔 extern "C" 鍖呭惈鍙岄噸鍚箟锛屼粠瀛楅潰涓婂嵆鍙緱鍒帮細棣栧厛锛岃瀹冧慨楗扮殑鐩爣鏄渆xtern鈥濈殑锛涘叾娆★紝琚畠淇グ鐨勭洰鏍囨槸鈥淐鈥濈殑銆傝extern "C"闄愬畾鐨勫嚱鏁版垨鍙橀噺鏄痚xtern绫诲瀷鐨勶紱琚玡xtern "C"淇グ鐨鍙橀噺鍜屽嚱鏁鏄寜鐓璇█鏂瑰紡缂栬瘧鍜岄摼鎺ョ殑 棣栧厛鐪嬬湅C++涓绫讳技C鐨勫嚱鏁版槸鎬庢牱缂栬瘧鐨勩備綔涓轰竴绉...
  • C璇█涓,extern 淇グ鍑芥暟鏄粈涔堟剰鎬?
    绛旓細extern琛ㄦ槑杩欎釜鍑芥暟鎴栬鍙橀噺鍦ㄥ埆鐨勬枃浠朵腑瀹氫箟鐨勶紝鍦ㄦ枃浠禔涓墠鑳戒娇鐢ㄨ繖涓嚱鏁版垨鑰呭彉閲 涓嶇敵鏄巈xtern涔熻兘璋冪敤鍑芥暟f锛屾垜璇曡繃浜嗭紒閭f槸鍥犱负浣爄nclude浜嗘枃浠禕
  • C鍑芥暟鍓嶅姞extern鏄粈涔堟剰鎬?
    绛旓細璇存槑杩欎釜鍑芥暟鏄湪鍏跺畠鐨勬枃浠朵腑宸茬粡鏈夌殑锛岀敤extern鍙槸寮曠敤鍏跺畠鏂囦欢鐨勫嚱鏁
  • c璇█extern璺static鍙互涓璧风敤鍚
    绛旓細涓嶈兘銆extern淇グ鍏ㄥ眬鍙橀噺鍜屽嚱鏁锛岃淇グ鐨勫彉閲忓拰鍑芥暟鍙互鍦ㄥ埆鐨勬枃浠堕噷浣跨敤銆傝宻tatic淇グ鐨勫彉閲忓拰鍑芥暟浣滅敤鑼冨洿浠呴檺浜庡畾涔夊畠鐨勬枃浠跺唴閮ㄣ備袱鑰呮槸鍐茬獊鐨勩
  • c++涓 鐢extern澹版槑澶栭儴鍙橀噺鏃惰兘涓嶈兘缁欏彉閲忚祴鍒濆
    绛旓細鑲畾涓嶅彲浠ョ殑鍟,澹版槑鐨勭洰鐨勬槸鍛婅瘔缂栬瘧鍣鍙橀噺鎴鍑芥暟鐨勭被鍨,鏆楃ず鍦ㄦ煇澶勪細鏈変粬鐨勬纭畾涔夈傚噯纭璧锋潵,鍙橀噺涓庡嚱鏁版槸鐩稿悓鐨,閮藉垎涓哄0鏄庡拰瀹氫箟,鍗冲湪鍓嶉潰鍔犱笂extern,鍙笉杩囧嚭浜庣畝鍗曠殑鐩殑,鍑芥暟鐨勫0鏄庣渷鐣ヤ簡extern鍏抽敭瀛,鍑芥暟涓嶈兘鍐嶅0鏄(闄ら潪鏄畾涔)澶勫畾涔夊嚱鏁颁綋銆傛垜浠氬父鐨勫彉閲忓0鏄庝富瑕佹槸澹版槑鍙橀噺鐨勭被鍨(缂栬瘧鍣ㄨ涓烘槸鍒嗛厤...
  • C璇█ 鍑芥暟澹版槑鍓extern鐨勭敤娉?
    绛旓細锛2锛変綔鐢ㄧ浉鍚岋紝涓嶅畬鍏ㄧ瓑浠枫傚尯鍒湪鍝憿锛焛nclude 鈥*.h鈥漣nt f()锛涙妸鈥*.h鈥濋噷鐨勬墍鏈変笢瑗块兘鎼繃鏉ワ紙闄や簡f()涔嬪鍙兘杩樻湁鍏朵粬鐨勶級锛岄偅涔堣偗瀹氬寘鍚湁f()锛涜extern int f()锛涜〃绀轰綘鏄庣‘鐭ラ亾浣犺璋冪敤鐨勬槸鈥*.h鈥濋噷鐨刦()杩欎釜鍑芥暟锛屽叾瀹冧綘閮戒笉闇瑕併傗滆繖涔堣锛屽鏋滄墍鏈澶栭儴鍑芥暟澹版槑鏃堕兘鍔犱笂...
  • 扩展阅读:extern int ... 关键字extern的作用 ... extern关键字详解 ... extern声明 ... extern c++ ... extern怎么使用 ... extern用法举例 ... extern函数怎么用 ... extern具体用法 ...

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