1. 程式人生 > >C/C++中#pragma once的使用

C/C++中#pragma once的使用

標準 class define The content 針對 相同 spa clu

在C/C++中,為了避免同一個文件被include多次,有兩種方式:一種是#ifndef方式,一種是#pragma once方式(在頭文件的最開始加入)。

#ifndef SOME_UNIQUE_NAME_HERE
#define SOME_UNIQUE_NAME_HERE


// contents of the header

...


#endif // SOME_UNIQUE_NAME_HERE
#pragma once


// contents of the header

...

#ifndef的是方式是受C/C++語言標準支持。#ifndef方式依賴於宏名不能沖突。它不光可以保證同一個文件不會被包含多次,也能保證內容完全相同的兩個文件不會被不小心同時包含。缺點是如果不同頭文件中的宏名不小心”碰撞”,可能就會導致你看到頭文件明明存在,編譯器卻硬說找不到聲明的狀況。由於編譯器每次都需要打開頭文件才能判定是否有重復定義,因此在編譯大型項目時,#ifndef會使得編譯時間相對較長,因此一些編譯器逐漸開始支持#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只能針對整個文件。

C/C++中#pragma once的使用