在 c 語言中,可以採用命令 #define 來定義巨集。在定義了巨集之後,無論巨集名稱出現在源**的何處,預處理器都會把它用定義時指定的文字替換掉。
#define 巨集名稱 替換文字
#define print printf("hello world!")
#define 巨集名稱( [形參列表] ) 替換文字你可以定義具有形式引數(簡稱「形參」)的巨集。當預處理器展開這類巨集時,它先使用呼叫巨集時指定的實際引數(簡稱「實參」)取代替換文字中對應的形參。帶有形參的巨集通常也稱為類函式巨集(function-like macro)。「形參列表」是用逗號隔開的多個識別符號,它們都作為巨集的形參。當使用這類巨集時,實參列表中的實參數量必須與巨集定義中的形參數量一樣多(然而,c99 允許使用「空實參」)。這裡的省略號意味著乙個或更多的額外形參。#define 巨集名稱( [形參列表 ,] ... ) 替換文字
當定義乙個巨集時,必須確保巨集名稱與左括號之間沒有空白符。如果在名稱後面有任何空白,那麼命令就會把巨集作為沒有引數的巨集,且從左括號開始採用替換文字。
c99 標準允許定義有省略號的巨集,省略號必須放在引數列表的後面,以表示可選引數。你可以用可選引數來呼叫這類巨集。
當呼叫有可選引數的巨集時,預處理器會將所有可選引數連同分隔它們的逗號打包在一起作為乙個引數。在替換文字中,識別符號 __va_args__ 對應一組前述打包的可選引數。識別符號 __va_args__ 只能用在巨集定義時的替換文字中。
__va_args__ 的行為和其他巨集引數一樣,唯一不同的是,它會被呼叫時所用的引數列表中剩下的所有引數取代,而不是僅僅被乙個引數取代。
可選引數巨集的示例:
//預定義的識別符號 __func__ 可以在任一函式中使用,該識別符號是表示當前函式名的字串。因此,該示例中的巨集呼叫會將當前函式名和變數 intvar 的內容寫入日誌檔案。假設我們有乙個已開啟的日誌檔案,準備採用檔案指標fp_log對其進行寫入
#define printlog(...) fprintf( fp_log, __va_args__ )
//使用巨集printlog
printlog( "
%s: intvar = %d\n
", __func__, intvar );
//預處理器把最後一行的巨集呼叫替換成下面的一行**:
fprintf( fp_log, "
%s: intvar = %d\n
", __func__, intvar );
字串化指的是,可以在巨集的引數前面加入#,使入參變成字串。
#include #define str(expr) printf("%s\r\n", #expr)有多條語句時,我們就在每行末尾(除了最後一行)加上"\",代表換行的意思intmain()
這裡執行**會列印:
abc12345
在巨集中,可以使用兩個#將兩個符號連線成乙個符號。
#define pi 3.141592654… //code
#undef pi
//下面開始 pi 就失效了
C語言基礎 11 巨集
巨集也可以用來給計算公式起名字 計算公式裡包含未知數字,需要使用巨集的引數表示這些未知數字 帶引數的巨集採用二次替換方式進行處理 巨集的引數不一定代表數字,所以沒有型別名稱 如果巨集有多個引數應該用逗號把相鄰的引數名稱分隔開 巨集不可以使用自己的儲存區和函式進行資料傳遞 巨集沒有形式引數也沒有用來存...
C語言基礎 巨集函式
函式式巨集 巨集函式 和函式模擬會更加靈活,我們通過兩個例子來看一下。函式 include intsqr int int x double sqr double double x intmain int argc char ar 函式式巨集 include define sqr x x x intm...
C語言基礎學習筆記 巨集
巨集定義 define用來定義乙個識別符號和乙個字串,用這個識別符號替代這個字串。1.不帶引數的巨集定義 define 巨集名 字串 表示這是一條預處理命令 巨集名,是乙個識別符號,要符合識別符號的命名規則,並要求大寫 字串的位置可以是常量 表示式 格式字串 注意 巨集定義不是語句,不需要在末尾加分...