在c/c++中,在使用預編譯指令#include的時候,為了防止重複引用造成二義性,通常有兩種方式——
第一種是#ifndef指令防止**塊重複引用,比如說
#ifndef _code_block
#define _code_block
// code
#endif
// _code_block
第二種就是#pragma once指令,在想要保護的檔案開頭寫入
#pragma once
#ifndef方式是c/c++語言的標準支援,也是比較常用的方式,#ifndef的方式依賴於自定義的巨集名(例中的_code_block)不能衝突,它不光可以保證同一份檔案不會被包含兩次,也能夠保證不同檔案完全相同的內容不會被包含兩次。但,同樣的,如果自定義的巨集名不小心「重名」了,兩份不同的檔案使用同乙個巨集名進行#ifndef,那麼會導致編譯器找不到宣告的情況(被編譯器判定為重定義而遮蔽了)。
此外,由於編譯器每次都需要開啟標頭檔案才能判定是否有重複定義,因此在編譯大型專案時,#ifndef會使得編譯時間相對較長,因此一些編譯器逐漸開始支援#pragma once的方式(visual studio 2017新建標頭檔案會自帶#pragma once指令)。
#pragma once一般由編譯器提供保證:同乙個檔案不會被包含多次。這裡所說的」同乙個檔案」是指物理上的乙個檔案,而不是指內容相同的兩個檔案。無法對乙個標頭檔案中的一段**作#pragma once宣告,而只能針對檔案。此方式不會出現巨集名碰撞引發的奇怪問題,大型專案的編譯速度也因此提供了一些。缺點是如果某個標頭檔案有多份拷貝,此方法不能保證它們不被重複包含。在c/c++中,#pragma once是乙個非標準但是被廣泛支援的方式。
#pragma once方式產生於#ifndef之後。#ifndef方式受c/c++語言標準的支援,不受編譯器的任何限制;而#pragma once方式有些編譯器不支援(較老編譯器不支援,如gcc 3.4版本之前不支援#pragmaonce),相容性不夠好。#ifndef可以針對乙個檔案中的部分**,而#pragma once只能針對整個檔案。相對而言,#ifndef更加靈活,相容性好,#pragma once操作簡單,效率高。
pragma once 用法總結
1.pragmaonce這個巨集有什麼作用?為了避免同乙個標頭檔案被包含 include 多次,c c 中有兩種巨集實現方式 一種是 ifndef方式 另一種是 pragma once方式。在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別。但兩者仍然有一些細微的區別。2.兩者的使用方式有何區別?...
pragma once 用法含意
pragma once 用法含意 pragma指令簡介 在編寫程式的時候,我們經常要用到 pragma指令來設定編譯器的狀態或者是指示編譯器完成一些特定的動作.下面介紹了一下該指令的一些常用引數,希望對大家有所幫助 一.message 引數。message 它能夠在編譯資訊輸出窗 口中輸出相應的資訊...
pragma once含義及用法
pragma once是乙個比較常用的c c 雜注,只要在標頭檔案的最開始加入這條雜注,就能夠保證標頭檔案只被編譯一次。pragma once是編譯器相關的,有的編譯器支援,有的編譯器不支援,具體情況請檢視編譯器api文件,不過現在大部分編譯器都有這個雜注了。ifndef,define,endif是...