#undef
#undef 是在后面取消以前定義的宏定義
該指令的形式為
#undef 標(biāo)識(shí)符
其中,標(biāo)識(shí)符是一個(gè)宏名稱。如果標(biāo)識(shí)符當(dāng)前沒(méi)有被定義成一個(gè)宏名稱,那么就會(huì)忽略該指令。
一旦定義預(yù)處理器標(biāo)識(shí)符,它將保持已定義狀態(tài)且在作用域內(nèi),直到程序結(jié)束或者使用#undef 指令取消定義。
在此程序中,我們將取消在先前程序中對(duì)預(yù)處理器的定義。
源代碼:
#define TRACE(x)
#if DBG
#undef TRACE
#define TRACE(x) g_TraceCallback x
#else
#ifndef TRACE
#define TRACE(x)
#endif
#endif
解析:
#define TRACE(x)
#if DBG //成立的話跑這支
#undef TRACE //釋放之前定義的 #define TRACE ,防止重復(fù)定義
#define TRACE(x) g_TraceCallback x
#else // DBG 不成立 跑這支
#ifndef TRACE //當(dāng)TRACE 沒(méi)有被定義
#define TRACE(x) //宏定義
#endif
#endif// DBG
#ifdef,#ifndef使用
條件編譯命令最常見(jiàn)的形式為:
#ifdef 標(biāo)識(shí)符
程序段1
#else
程序段2
#endif
它的作用是:當(dāng)標(biāo)識(shí)符已經(jīng)被定義過(guò)(一般是用#define命令定義),則對(duì)程序段1進(jìn)行編譯,否則編譯程序段2。
其中#else部分也可以沒(méi)有,即:
#ifdef
程序段1
#denif
這里的“程序段”可以是語(yǔ)句組,也可以是命令行。這種條件編譯可以提高C源程序的通用性。如果一個(gè)C源程序在不同計(jì)算機(jī)系統(tǒng)上系統(tǒng)上運(yùn)行,而不同的計(jì)算機(jī)又有一定的差異。例如,當(dāng)程式跑到else,如果TRACE沒(méi)被定義,則下一句再定義
源代碼:
#define TRACE(x)
#if DBG
#undef TRACE
#define TRACE(x) g_TraceCallback x
#else
#ifndef TRACE
#define TRACE(x)
#endif
#endif
解析:
#define TRACE(x)
#if DBG
#undef TRACE
#define TRACE(x) g_TraceCallback x
#else
#ifndef TRACE //如果之前沒(méi)定義,則跑下邊定義------該例前邊有#define TRACE(x) ,則后邊的定義自動(dòng)失效因此不會(huì)因?yàn)橹貜?fù)定義而出錯(cuò)
#define TRACE(x) //定義
#endif
#endif
我們有時(shí)也采用下面的形式:
#ifndef 標(biāo)識(shí)符
程序段1
#else
程序段2
#endif
只是第一行與第一種形式不同:將“ifdef”改為“ifndef”。它的作用是:若標(biāo)識(shí)符未被定義則編譯程序段1,否則編譯程序段2。這種形式與第一種形式的作用相反。
以上兩種形式用法差不多,根據(jù)需要任選一種,視方便而定。
還有一種形式,就是#if后面的是一個(gè)表達(dá)式,而不是一個(gè)簡(jiǎn)單的標(biāo)識(shí)符:
#if 表達(dá)式
程序段1
#else
程序段2
#endif
當(dāng)表達(dá)式成立,則跑程序段1,否則跑程序段2
注意:
除#undef釋放之前的宏定義可單獨(dú)使用之外,
#ifdef,#if,#ifndef均要與#endif配對(duì)
如:
#if...#else...#endif
#ifdef...#endif
#ifndef...#endif
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。