#pragma指令與#ifndef指令
在C/C++中,在使用預(yù)編譯指令#include的時(shí)候,為了防止重復(fù)引用造成二義性仆邓,通常有兩種方式? ? 第一種是#ifndef指令防止代碼塊重復(fù)引用
第二種就是#pragma once指令,在想要保護(hù)的文件開頭寫入
#ifndef方式是C/C++語(yǔ)言的標(biāo)準(zhǔn)支持,也是比較常用的方式凭迹,#ifndef的方式依賴于自定義的宏名(例中的_CODE_BLOCK)不能沖突,它不光可以保證同一份文件不會(huì)被包含兩次苦囱,也能夠保證不同文件完全相同的內(nèi)容不會(huì)被包含兩次嗅绸。但,同樣的撕彤,如果自定義的宏名不小心“重名”了鱼鸠,兩份不同的文件使用同一個(gè)宏名進(jìn)行#ifndef,那么會(huì)導(dǎo)致編譯器找不到聲明的情況(被編譯器判定為重定義而屏蔽了)羹铅。
此外蚀狰,由于編譯器每次都需要打開頭文件才能判定是否有重復(fù)定義,因此在編譯大型項(xiàng)目時(shí)职员,#ifndef會(huì)使得編譯時(shí)間相對(duì)較長(zhǎng)麻蹋,因此一些編譯器逐漸開始支持#pragma once的方式(Visual Studio 2017新建頭文件會(huì)自帶#pragma once指令)。
#pragma once一般由編譯器提供保證:同一個(gè)文件不會(huì)被包含多次焊切。這里所說(shuō)的”同一個(gè)文件”是指物理上的一個(gè)文件扮授,而不是指內(nèi)容相同的兩個(gè)文件。無(wú)法對(duì)一個(gè)頭文件中的一段代碼作#pragma once聲明专肪,而只能針對(duì)文件刹勃。此方式不會(huì)出現(xiàn)宏名碰撞引發(fā)的奇怪問(wèn)題,大型項(xiàng)目的編譯速度也因此提供了一些嚎尤。缺點(diǎn)是如果某個(gè)頭文件有多份拷貝荔仁,此方法不能保證它們不被重復(fù)包含。在C/C++中诺苹,#pragma once是一個(gè)非標(biāo)準(zhǔn)但是被廣泛支持的方式咕晋。
? ? ? ? #pragma once方式產(chǎn)生于#ifndef之后。#ifndef方式受C/C++語(yǔ)言標(biāo)準(zhǔn)的支持收奔,不受編譯器的任何限制掌呜;而#pragma once方式有些編譯器不支持(較老編譯器不支持,如GCC 3.4版本之前不支持#pragmaonce)坪哄,兼容性不夠好质蕉。#ifndef可以針對(duì)一個(gè)文件中的部分代碼势篡,而#pragma once只能針對(duì)整個(gè)文件。相對(duì)而言模暗,#ifndef更加靈活禁悠,兼容性好,#pragma once操作簡(jiǎn)單兑宇,效率高
————————————————
版權(quán)聲明:本文為CSDN博主「大山喵」的原創(chuàng)文章碍侦,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明隶糕。
原文鏈接:https://blog.csdn.net/CV_Jason/article/details/81842710