Posted on 2008-07-16 18:10
RichardHe 閱讀(442)
評論(0) 編輯 收藏 引用 所屬分類:
[轉]
關于## 和 #及#@的用法
## 是連接符號 連接兩個宏,##被稱為連接符(concatenator),用來將兩個Token連接為一個Token。注意這里連接的對象是Token就行,而不一定是宏的變
量。比如你要做一個菜單項命令名和函數指針組成的結構體的數組,并且希望在函數名和菜單項命令名之間有直觀的、名字上的關系。那就可以使用:宏參數##
固定部分。當然還可以n個##符號連接 n+1個Token,這個特性也是#符號所不具備的。
#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d
typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);
// 這里這個語句將展開為:
// typedef struct _record_type name_company_position_salary;
#@功能是將其后面的宏參數進行字符化。
#define makechar(x)
#@x
a = makechar(b);
//a = 'b';
#是把名字代替成字符串,宏體中,#的功能是將其后面的宏參數進行字符串化操作(Stringfication),簡單說就是在對它所引用的宏變量通過替換后在其左右各加上一個
雙引號。
#define WARN_IF(EXP) \
do{ if (EXP) \
fprintf(stderr, "Warning: " #EXP "\n"); } \
while(0)
那么實際使用中會出現下面所示的替換過程:
WARN_IF (divider == 0);
被替換為
do {
if (divider == 0)
fprintf(stderr, "Warning" "divider == 0" "\n");
} while(0);
這樣每次divider(除數)為0的時候便會在標準錯誤流上輸出一個提示信息。
!IF constantexpression
如果 constantexpression 計算結果為非零值,則處理 !IF 和下一個 !ELSE 或 !ENDIF 之間的語句。
!ENDIF
標記 !IF、!IFDEF 或 !IFNDEF 塊的結尾。同一行上 !ENDIF 后面的所有文本被忽略。