C/C++中的預處理變量的作用
我們在編寫程序時,同時包含一個頭文件多次是一件常見的事情,當然同時多次包含一個頭文件可能會引起不必要的錯誤。使得頭文件安全的通用做法,是使用預處理器定義頭文件保護符。頭文件保護符用于避免在已經見到頭文件的情況下重新處理該頭文件的內容。
C++為了避免頭文件的多次包含,引入了預處理變量:#define,#ifndef ,#endif。
預處理器變量 的名字在程序中必須是唯一的。任何與預處理器變量相匹配的名字的使用都關聯到該預處理器變量。為了避免名字沖突,預處理器變量經常用全大寫字母表示。
預處理器變量有兩種狀態:已定義或未定義。定義預處理器變量和檢測其狀
態所用的預處理器指示不同。
#define 指示接受一個名字并定義該名字為預處理器變量。
#ifndef字面意思就是if not define,如果沒有定義指示檢測指定的預處理器變量是否未定義。如果預處理器變量未定義,那么跟在其后的所有指示都被處理,直到出現 #endif。
沒有接觸過預處理器變量的同學看了上面解釋可能不太理解,下面具體一下說明預處理變量用法和意義所在。
假設現在有兩個頭文件xx1.h,和xx2.h。其中xx1.h包含一個類class1的定義;如果在頭文件xx2.h中要用到class1這個類,那么我們在xx2.h這個頭文件里面則要包含xx1.h這個頭文件,即:#include“xx1.h”。
在主程序xx.cpp中,開始需要把自定義的頭文件xx1.h和xx2.h給加進去,即:#include“xx1.h”
#include“xx2.h”
那么這樣xx1.h這個頭文件實際上被包含了兩次,xx1.h中的類class1也相當于被定義了兩次,在編譯時會出現錯誤,那么上面介紹的預處理變量:#define,#ifndef ,#endif可以完美的解決這個問題。
首先我們在xx1.h里加入這樣的幾句話:
#ifndef XX1
#define XX1
//
xx1.h里面原有的代碼
//
#endif
這樣當xx1.h這個頭文件被包含多次時,在主程序處理時卻只會被處理一次。下面稍作解釋:
當主程序遇見頭文件#include“xx1.h”時,如果是第一次處理xx1.h頭文件,由于預處理器變量XX1還沒有被定義,所以會執行#ifndef XX1這個語句,同時預處理器變量XX1也被定義,頭文件xx1.h中的代碼也會被執行。
當主程序遇見頭文件#include“xx2.h”時,因為xx2.h也包含xx1.h,所以程序還會再次進入到xx1.h這個頭文件中執行,這時由于預處理器變量XX1在第一次執行xx1.h這個頭文件時已經被定義,所以#ifndef XX1條件判斷失敗,那么便不會在繼續執行后續的代碼,即不會在執行xx1.h頭文件中編寫的代碼了。這樣便保證了頭文件xx1.h在包含多次的情況下只會被處理一次。
轉載自@xiaoaihhh, https://blog.csdn.net/u010213393/article/details/40556331

浙公網安備 33010602011771號