91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中怎么防止頭文件被重復引入

發布時間:2021-07-06 17:20:50 來源:億速云 閱讀:162 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關C++中怎么防止頭文件被重復引入,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

1) 使用宏定義避免重復引入

在實際多文件開發中,我們往往使用如下的宏定義來避免發生重復引入:

#ifndef _NAME_H
#define _NAME_H//頭文件內容#endif

其中,_NAME_H 是宏的名稱。需要注意的是,這里設置的宏名必須是獨一無二的,不要和項目中其他宏的名稱相同。

當程序中第一次 #include 該文件時,由于 _NAME_H 尚未定義,所以會定義 _NAME_H 并執行“頭文件內容”部分的代碼;當發生多次 #include 時,因為前面已經定義了 _NAME_H,所以不會再重復執行“頭文件內容”部分的代碼。

也就是說,我們可以將前面項目中的 student.h 文件做如下修改:

#ifndef _STUDENT_H
#define _STUDENT_Hclass Student {//......};#endif

雖然該項目 main.cpp 文件中仍 #include 了 2 次 "student.h",但鑒于 _STUDENT_H 宏只能定義一次,所以 Student 類也僅會定義一次。再次執行該項目會發現,其可以正常執行。

2) 使用#pragma once避免重復引入

除了前面第一種最常用的方式之外,還可以使用 #pragma one 指令,將其附加到指定文件的最開頭位置,則該文件就只會被 #include 一次。

我們知道,#ifndef 是通過定義獨一無二的宏來避免重復引入的,這意味著每次引入頭文件都要進行識別,所以效率不高。但考慮到 C 和 C++ 都支持宏定義,所以項目中使用 #ifndef 規避可能出現的“頭文件重復引入”問題,不會影響項目的可移植性。

和 ifndef 相比,#pragma once 不涉及宏定義,當編譯器遇到它時就會立刻知道當前文件只引入一次,所以效率很高。

但值得一提的是,并不是每個版本的編譯器都能識別 #pragma once 指令,一些較老版本的編譯器就不支持該指令(執行時會發出警告,但編譯會繼續進行),即 #pragma once 指令的兼容性不是很好。

目前,幾乎所有常見的編譯器都支持 #pragma once 指令,甚至于 Visual Studio 2017 新建頭文件時就會自帶該指令。可以這么說,在 C/C++ 中,#pragma once 是一個非標準但卻逐漸被很多編譯器支持的指令。

除此之外,#pragma once 只能作用于某個具體的文件,而無法向 #ifndef 那樣僅作用于指定的一段代碼。

這里仍以前面的 "student.h" 文件為例,將其內容修改為:

#pragma onceclass Student {//......};

再次運行項目,同樣可以正常執行。

3) 使用_Pragma操作符

C99 標準中新增加了一個和 #pragma 指令類似的 _Pragma 操作符,其可以看做是 #pragma 的增強版,不僅可以實現 #pragma 所有的功能,更重要的是,_Pragma 還能和宏搭配使用。

有關 _Pragma 操作符更多的功能和用法,本節不做詳細講解,這里僅介紹如何用 _Pragma 操作符避免頭文件重復引入。

當處理頭文件重復引入問題時,可以將如下語句添加到相應文件的開頭:

_Pragma("once")

比如,將該語句添加到前面項目中 student.h 文件中的開頭位置,再次執行項目,其可以正常執行。

事實上,無論是 C 語言還是 C++,為防止用戶重復引入系統庫文件,幾乎所有庫文件中都采用了以上 3 種結構中的一種,這也是為什么重復引入系統庫文件編譯器也不會報錯的原因。

看完上述內容,你們對C++中怎么防止頭文件被重復引入有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

长乐市| 宜黄县| 烟台市| 高淳县| 荆州市| 建阳市| 外汇| 甘德县| 惠东县| 克东县| 都兰县| 松溪县| 潼关县| 锦州市| 织金县| 合水县| 伊春市| 金寨县| 韶关市| 邻水| 英德市| 九龙县| 商城县| 若尔盖县| 延寿县| 蒲城县| 潼南县| 西乌珠穆沁旗| 民乐县| 沾益县| 大名县| 澳门| 上虞市| 涟水县| 子洲县| 宝丰县| 会昌县| 锡林郭勒盟| 曲周县| 维西| 峨边|