ifndef是 if not define 的縮寫,一種宏定義。它是預處理功能中三種(宏定義,文件包含和條件編譯)中的第三種--條件編譯。
其使用方式是:
#define X ... #endif
//c語言在對程序進行編譯時,會先根據預處理命令進行預處理,C語言編譯系統包括預處理,編譯和鏈接等部分。
#ifndef X //先測試是否被宏定義過 #define X 程序段1//如果X沒有被宏定義過,定義X,並編譯程序段1; #else 程序段2 //如果X已經定義過了則編譯程序段2 的語句,忽視程序段1. #endif
條件指示符#ifndef的最主要目的是防止頭文件的重復包含和編譯。
語句1 #ifndef 標識1 語句2 #define 標識1 語句3 #endif 語句4 …… 語句5 ……
該段代碼意思是:如果標識1沒有被定義,則重定義標識1,即執行語句2、語句3;如果標識1已經被定義,則直接跳過語句2、語句3,直接執行語句4、語句5、……
ifndef和endif要一起使用,不能存在丟失。
假如你有一個C源文件,它包含了多個頭文件,比如頭文件A和頭文件B,頭文件B又包含了頭文件A,則最終該源文件包含了兩次頭文件A。如果你在頭文件A里定義了結構體或者類類型(這是最常見的情況),那么問題來了,編譯時會報大量的重復定義錯誤。[1]
例如要編寫頭文件a.h,需要在頭文件開頭寫上兩行:
#ifndef _A_H #define _A_H//一般是文件名的大寫
頭文件結尾寫上一行:
#endif
這樣一個工程文件里同時包含兩個test.h時,就不會出現重定義的錯誤了。
當第一次包含test.h時,由於沒有定義_TEST_H,條件為真,這樣就會包含(執行)#ifndef _TEST_H 和 #endif之間的代碼,當第二次包含test.h時前面一次已經定義了_TEST_H,條件為假,#ifndef _TEST_H和 #endif之間的代碼也就不會再次被包含,這樣就避免了重定義了。這樣我們把頭文件的內容都放在#ifndef和#endif中。不管你的頭文件會不會被多個文件引用,你最好是都加上這個。