欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

c++如何防止頭文件重復(fù)引入-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)c++如何防止頭文件重復(fù)引入,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

十多年的三明網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整三明建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“三明網(wǎng)站設(shè)計”,“三明網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。

C 語言中如何使用宏定義(#ifndef / #define / #endif)來有效避免頭文件被重復(fù) #include,此方式在 C++ 多文件編程中也很常用。

舉個例子,如下是一個 C++ 項目,其內(nèi)部含有 school.h 和 student.h 這 2 個頭文件以及 main.cpp 源文件,其各自包含的代碼為:

//student.h

class Student {

    //......

};

//school.h

#include "student.h"

class School {

    //......

private:

    Student stu[50];

};

//main.cpp

#include "student.h"

#include "school.h"

int main() {

    //......

    return 0;

}

運行此項目會發(fā)現(xiàn),編譯器報“Student 類型重定義”錯誤。這是因為在 school.h 文件中已經(jīng) #include 了一次 "student.h",而在 main.cpp 主程序又同時 #include 了 "school.h" 和 "student.h",即 Student 類的定義被引入了 2 次,C++不允許同一個類被重復(fù)定義。

有小伙伴可能想到,既然 School.h 文件中已經(jīng)引入了 Student 類,那去掉 main.cpp 主程序引入的 student.h 文件不就可以了嗎?這樣確實可以避免重復(fù)引入 Student 類,但此方式并不適用于所有“重復(fù)引入”的場景。

C++ 多文件編程中,處理“多次 #include 導(dǎo)致重復(fù)引入”問題的方式有以下 3 種。

————————

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

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

#ifndef _NAME_H

#define _NAME_H

//頭文件內(nèi)容

#endif

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

當(dāng)程序中第一次 #include 該文件時,由于 _NAME_H 尚未定義,所以會定義 _NAME_H 并執(zhí)行“頭文件內(nèi)容”部分的代碼;當(dāng)發(fā)生多次 #include 時,因為前面已經(jīng)定義了 _NAME_H,所以不會再重復(fù)執(zhí)行“頭文件內(nèi)容”部分的代碼。

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

#ifndef _STUDENT_H

#define _STUDENT_H

class Student {

    //......

};

#endif

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

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

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

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

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

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

目前,幾乎所有常見的編譯器都支持 #pragma once 指令,甚至于 Visual Studio 2017 新建頭文件時就會自帶該指令??梢赃@么說,在 C/C++ 中,#pragma once 是一個非標(biāo)準(zhǔn)但卻逐漸被很多編譯器支持的指令。

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

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

#pragma once

class Student {

    //......

};

3) 使用_Pragma操作符

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

有關(guān) _Pragma 操作符更多的功能和用法,本節(jié)不做詳細(xì)講解,這里僅介紹如何用 _Pragma 操作符避免頭文件重復(fù)引入。

當(dāng)處理頭文件重復(fù)引入問題時,可以將如下語句添加到相應(yīng)文件的開頭:

_Pragma("once")

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

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

總結(jié)

本節(jié)介紹了 3 種避免頭文件被重復(fù)引入的方法,其中 #pragma once 和 _Pragma("once") 可算作一類,其特點是編譯效率高,但可移植性差(編譯器不支持,會發(fā)出警告,但不會中斷程序的執(zhí)行);而 #ifndef 的特點是可移植性高,編譯效率差。讀者可根據(jù)實際情況,挑選最符合實際需要的解決方案。

除非對項目的編譯效率有嚴(yán)格的要求,強烈推薦讀者選用第一種解決方案,即采用 #ifndef / #define / #endif 組合解決頭文件被重復(fù)引入。

另外在某些場景中,考慮到編譯效率和可移植性,#pragma once 和 #ifndef 經(jīng)常被結(jié)合使用來避免頭文件被重復(fù)引入。比如說:

#pragma once

#ifndef _STUDENT_H

#define _STUDENT_H

class Student {

    //......

};

#endif

當(dāng)編譯器可以識別 #pragma once 時,則整個文件僅被編譯一次;反之,即便編譯器不識別 #pragma once 指令,此時仍有 #ifndef 在發(fā)揮作用。

關(guān)于“c++如何防止頭文件重復(fù)引入”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

當(dāng)前題目:c++如何防止頭文件重復(fù)引入-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://aaarwkj.com/article6/dspiog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)做網(wǎng)站、ChatGPT網(wǎng)站維護、響應(yīng)式網(wǎng)站、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
亚洲成人精品一区二区| 亚洲欧美熟妇欲乱又伦| 亚洲精品污一区二区三区| 国产高清av免费观看| 亚洲毛片高清一区二区三区| 最新在线中文字幕av不卡| 久久亚洲av电影网站| 日本成人一区二区三区在线| 亚洲乱色熟女一区二区三区麻豆 | 日韩无遮挡免费在线观看| 亚洲国产日韩欧美视频| 麻豆文化传媒免费网址| 欧美日韩国产精品高清| 五月天丁香婷婷狠狠狠| 中文在线在线天堂中文| 国产在线拍揄自揄视频不卡99| 国内精品亚洲成av人片麻豆| 麻豆精品国产一区二区91| 国产人妖cd蜜雅丝袜美女| 精品久久久久久久久999| 成人亚洲精品一区二区三区| 国产精品中文第一字幕| 人成午夜视频在线播放| 男人的天堂av免费看看| av在线观看亚洲天堂| 日本亚洲中文字幕无吗| 国产精品久久中文字幕网| 亚洲精品永久在线观看| 成年人收看黄色一二级片| 精品不卡一区二区三区| 伊人欧美一区二区三区| 日韩精品国产自拍在线| 国产v精品欧美精品v日韩| 欧美视频在线观看香蕉| 亚洲高清有码在线观看| 中文字幕亚洲欧美日韩高清| 久久热福利视频就在这里| 亚洲一区二区三区精品乱码| 欧美精品一区二区毛卡片| 亚洲国产韩国精品在线| 中国人妻一区二区三区|