作用:防止頭文件的重復包含和編譯
定義
#ifndef x
#define x
...
#endif
這是宏定義的一種,它可以根據是否已經定義了一個變量來進行分支選擇,一般用於調試等等.實際上確切的說這應該是預處理功能中三種(宏定義,文件包含和條件編譯)中的一種----條件編譯。 C語言在對程序進行編譯時,會先根據預處理命令進行“預處理”。C語言編譯系統包括預處理,編譯和鏈接等部分。
#ifndef x
//先測試x是否被宏定義過
#define x
//如果沒有宏定義下面就宏定義x並編譯下面的語句
...
#endif
//如果已經定義了則編譯#endif后面的語句
條件指示符#ifndef檢查預編譯常量在前面是否已經被宏定義。如果在前面沒有被宏定義,則條件指示符的值為真,於是從#ifndef到#endif之間的所有語句都被包含進來進行編譯處理。相反,如果#ifndef指示符的值為假,則它與#endif指示符之間的行將被忽略。條件指示符#ifndef 的最主要目的是防止頭文件的重復包含和編譯。
補充一些內容
千萬不要忽略了頭件的中的#ifndef,這是一個很關鍵的東西。比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,於是問題來了,大量的聲明沖突。
還是把頭文件的內容都放在#ifndef和#endif中吧。不管你的頭文件會不會被多個文件引用,你都要加上這個。一般格式是這樣的:
#ifndef <標識>
#define <標識>
......
#endif
<標識>在理論上來說可以是自由命名的,但每個頭文件的這個“標識”都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前后加下划線,並把文件名中的“.”也變成下划線,如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif
#ifndef xxx//如果沒有定義xxx
#define xxx//定義xxx
#endif //結束如果
這個用法主要是在頭文件中,主要是為了防止類重復的include,所以在類的頭文件之前加上前面兩個,用類名替代xxx,在最后加上最后一句。
const 與 #define的比較
C++ 語言可以用const來定義常量,也可以用 #define來定義常量。但是前者比后者有更多的優點:
(1) const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,並且在字符替換可能會產生意料不到的錯誤(邊際效應)。
(2) 有些集成化的調試工具可以對const常量進行調試,但是不能對宏常量進行調試。
【規則5-2-1】在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。
拓展閱讀百度百科