標籤:
上篇文章中主要介紹了#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 == 68000int x;#elselong 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)<span style="white-space:pre"></span>#include "ibmpc.h'#elif defined (VAX)<span style="white-space:pre"></span>#include "vax.h'#elif defined (MAC)<span style="white-space:pre"></span>#include "mac.h"#else<span style="white-space:pre"></span>#include 'general.h'#endif
4、#error #line #progma
以後補充,用的太少了。
C語言筆記之條件編譯