C++中的頭文件與Extern(外部函數(shù)調(diào)用)方式
C++頭文件與Extern(外部函數(shù)調(diào)用)
⒈ 頭文件引用
⒉ extern調(diào)用同一個(gè)項(xiàng)目中的其他cpp文件中的函數(shù)
?【 main.cpp 】
#include"day0915_3.h" extern void func_1(); void func_2(){ cout << "Hello" << endl; } int main(){ // void (*x)(); // x = func_1; // x(); int a = 99; int *p = &a; cout << *p**p <<endl; cout << func_h() << endl; system("pause"); func_1(); return 0; }
?【 day0915_3.h 】
#ifndef 條件編譯,防止頭文件被多次包含
#ifndef __DAY0915_3_H__ #define __DAY0915_3_H__ #include"iostream" using namespace std; int func_h(); #endif
?【 day0915_3.cpp 】
#include <iostream> using namespace std; int func_h(){ return 999; } void func_1(){ cout << "hello,world!" << endl; }
通過(guò)extern和頭文件來(lái)引用函數(shù),有啥區(qū)別 ?
1、extern 應(yīng)用于全局變量,函數(shù)或模板聲明
說(shuō)明該符號(hào)具有外部鏈接 (external linkage) 屬性(這個(gè)符號(hào)在別處定義)。
2、變量可以聲明多次,但只能定義一次
在程序中變量可以聲明多次,但只能定義一次。
一般而言,定義就是聲明。
但 C++ 中由于 extern 的緣故,變量的聲明和定義是可以分開(kāi)的。
凡是沒(méi)有帶 extern 的聲明同時(shí)也都是定義。
而對(duì)函數(shù)而言,帶有{}是定義,否則是聲明。
int i; ? ? ? ? ? ? ? ?//聲明并定義i int j = 1; ? ? ? ? ? ?//聲明并定義j double max(double d1,double d2){} //函數(shù)定義 extern double max(double d1,double d2); ?//函數(shù)聲明
如果想聲明一個(gè)變量而非定義它,
就在變量名前添加關(guān)鍵字 extern,且不要顯式的初始化變量。
extern int i; ? ? ? ? ?//聲明i而非定義 extern int j = 2; ? ? ?//錯(cuò)誤,定義j而非聲明,會(huì)報(bào)錯(cuò),多重定義 int j; ? ? ? ? ? ? ? ? //錯(cuò)誤,重定義,注意這里的j是在全局范圍內(nèi)聲明
3、變量的聲明
當(dāng)鏈接器在一個(gè)全局變量聲明前看到 extern 關(guān)鍵字,
它會(huì)嘗試在其他文件中尋找這個(gè)變量的定義;
可以在頭文件中聲明一個(gè)變量,
在用的時(shí)候包含這個(gè)頭文件就相當(dāng)于聲明了這個(gè)變量。
4、使用 extern 和包含頭文件來(lái)引用函數(shù)有什么區(qū)別呢?
與 include 相比,extern 的引用方式比包含頭文件要更簡(jiǎn)潔:
extern 引用另一個(gè)文件的范圍小,想引用哪個(gè)函數(shù)就用 extern 聲明哪個(gè)函數(shù);
而 include 可以引用另一個(gè)文件的全部?jī)?nèi)容。
這樣做的一個(gè)明顯的好處是,
會(huì)提高程序編譯(預(yù)處理)效率,節(jié)省時(shí)間。
在大型 C++ 程序編譯過(guò)程中,這種差異是非常明顯的。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言?棧與數(shù)組的實(shí)現(xiàn)詳解
棧(stack)又名堆棧,它是一種運(yùn)算受限的線(xiàn)性表。限定僅在表尾進(jìn)行插入和刪除操作的線(xiàn)性表。這一端被稱(chēng)為棧頂,相對(duì)地,把另一端稱(chēng)為棧底。向一個(gè)棧插入新元素又稱(chēng)作進(jìn)棧、入?;驂簵?,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素2022-04-04C++基于EasyX庫(kù)實(shí)現(xiàn)拼圖小游戲
這篇文章主要為大家詳細(xì)介紹了C++基于EasyX庫(kù)實(shí)現(xiàn)拼圖小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07C語(yǔ)言實(shí)現(xiàn)數(shù)獨(dú)輔助器(附源碼)
數(shù)獨(dú)是源自瑞士的一種數(shù)學(xué)游戲。是一種運(yùn)用紙、筆進(jìn)行演算的邏輯游戲。本文將利用C語(yǔ)言制作一個(gè)數(shù)獨(dú)輔助器,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-01-01C語(yǔ)言大小端字節(jié)序存儲(chǔ)模式深入解讀
我們知道,當(dāng)編譯器執(zhí)行 “創(chuàng)建變量” 這一代碼時(shí),會(huì)在內(nèi)存中開(kāi)辟空間相應(yīng)的空間來(lái)存儲(chǔ)變量值。而對(duì)于整型變量而言,變量值又是以二進(jìn)制補(bǔ)碼的形式存放的2022-09-09C語(yǔ)言之malloc動(dòng)態(tài)分配內(nèi)存和free釋放
這篇文章主要介紹了C語(yǔ)言之malloc動(dòng)態(tài)分配內(nèi)存和free釋放,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)先序、中序、后序及層次四種遍歷
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)先序、中序、后序及層次四種遍歷方式,具有一定的知識(shí)性參考價(jià)值,需要的小伙伴可以先看一下2022-02-02- 本文詳細(xì)講解了socket編程,它是網(wǎng)絡(luò)中經(jīng)常使用的一門(mén)技術(shù),該文章通過(guò)大量的代碼來(lái)解釋?zhuān)蠹铱梢詤⒖紖⒖?/div> 2021-08-08
最新評(píng)論