1、功能
首先要知道#ifdef的功能,ifdef一看就是if define的縮寫,其實就是一個條件判斷語句,這個語句必須和#endif組合使用。看以下例句:
#include <iostream>
using namespace std;
#define num 123
int main() {
#ifdef num //如果宏定義了num,則執行#ifdef和#endif之間的語句
cout<<"num = "<< num << endl;
#endif
#ifndef num//如果沒有宏定義num,則執行#ifdef和#endif之間的語句
cout<<"Error! you have not defined num" <<endl;
#endif
return 0;
}
自己運行試試這個例子很容易知道這個兩個語句的功能。其實就是一個條件檢測語句,檢測你是否定義了某個名爲XXX的宏,如果定義了執行到endif之前的下列語句。endif就相當於一個括號,把需要執行的語句括起來。(ifndef就是if not def的縮寫)
2、應用
肯定很多人就要想了,這個檢測宏的語句拿來幹啥,在一個代碼塊中我自己用眼睛看不香嗎?問題就在這裏,萬一宏不在一個代碼塊中就有用了。假設有三個c++的.h類型的文件分別起名爲A.h、B.h、C.h,這個時候B.h include了C.h,A.h include了B.h,A.h include了C.h。具體關係如下:
B<==C
A<==B
A<==C
仔細觀察是不是C.h被A.h include了兩次(第一次是直接被include,第二次是C在B中,B在A中)。那麼在一個代碼文件中可以include另一個代碼文件兩次嗎?明顯是不可以的。那麼有些小夥伴就要說了我不引用兩次不就行了嗎,我自己寫代碼的時候注意一下。但是如果是多人合作呢,多個程序員負責多個部分,最後代碼合起來的時候就出現引用了兩次某個代碼文件是很正常的。
這個時候#ifndef就起作用了,假設我第一次引用某個代碼文件的時候我在這個被引用的代碼中創建一個宏名爲DEFINE_X,那麼我第二次引用這個代碼文件的時候這個宏DEFINE_X肯定就已經存在了,那麼假設我檢測如果DEFINE_X已經存在那麼第二次引用的這個代碼文件我就不管它(可以看作被註釋掉),這樣是不是就可以避免被引用兩次,示例如下:
#ifndef UNTITLED_TEST_H//第一次被引用時宏UNTITLED_TEST_H不存在,執行下列代碼
#define UNTITLED_TEST_H//第一執行的時候會定義一個UNTITLED_TEST_H,等到第二次被引用的時候UNTITLED_TEST_H已存在,整個部分將被忽略
int add(int x, int y) {
return x + y;
}
#endif //UNTITLED_TEST_H
如上例,我將test.h的所有函數定義,變量定義等放在#ifndef中,這樣第一執行的時候會執行代碼塊,第二次將跳過。