上篇文章中主要介紹了#define的用法,本文介紹幾個它的“近親”。
1、#undef
C語言不允許對同一個宏名稱重復定義,比如下面的寫法編譯時會報錯:
#define R 3 #define R 4那麼#undef就是用來取消對一個宏名的定義的,取消之後我們才可以重新使用它。
#define R 3 #undef R #define R 4即使開始沒有定義 R ,取消 R的定義也是合法的。如果想使用一個特定名字,但又不能確定前面是否已經使用了該名字,為安全起見,就可以取消該名字的定義。
2、#ifdef #ifndef #else #endif
先擺代碼:
#ifndef HEADER_FILENAME #define HEADER_FILENAME #endif
看名字就能猜到這是啥意思,#ifdef 是指如果某個宏名被定義了,那麼執行該命令和#endif或#else之間的代碼;而#ifndef恰好相反,如果某個宏名沒被定義,那麼執行它和#endif或#else之間的代碼。這些中間的代碼既可以是預處理命令,還可以是普通代碼。如:
#if MACHINE == 68000 int x; #else long x; #endif
#ifdef #else 格式非常類似於C中 的if else 。主要差異為預處理器不能識別標記代碼塊的花括號 {} ,因此使用#else (如果需要)和#endif (必須存在)來標記指令塊。這些條件結構可以嵌套。
一般地,當某文件包含幾個頭文件,而且每個頭文件都可能定義了相同的宏肘,使用#ifndef可以防止對該宏重復定義。此時,第一個頭文件中的定義變成有效定義,而其他頭文件中的定義則被忽略。為什麼會多次包含同一文件呢?最常見的原因是許多包含文件自身包含了其他文件,因此可能顯式地包含其他文件己經包含的文件。為什麼這會成為問題呢?因為頭文件中的有些語句在-個文件中只能出現一次(如結構類型的聲明)。標准C頭文件使用#ifndef技術來避免多次包含。
3、#if 和#elif 指令
它們更接近常規的 C中的 if和else,後跟常量整數表達式。如果表達式為非零值,則表達式為真。在該表達式中可以使用 C的關系運算符和邏輯運算符。
許多新的實現提供另一種方法來判斷-個名字是否已經定義。不需使用:
#ifdef VAX
而是采用下面的形式:
#if defined (VAX)
這裡, defined 是一個預處理器運算符,如 果defined 的 參數已用#define 定義過 , 那麼defined 返回1 ,否則返回 0。這種新方法的優點在於它可以和#elif一起使用。
#if defined (lBMPC) #include "ibmpc.h' #elif defined (VAX) #include "vax.h' #elif defined (MAC) #include "mac.h" #else #include 'general.h' #endif
4、#error #line #progma
以後補充,用的太少了。