// 宏中的#號是字符串化的意思,就是說把宏參數當作一個字符串。 // 可是考慮另外一種需求:咱們要字符串化的參數很長,咱們想用另一個宏代替這個參數。 // 這樣的話,你字符串化會有問題, // 字符串化的是另外一個宏的名字,而不是宏的值。 // 這就出現了本篇要討論的問題:如何使用一個宏的值做爲參數傳遞給另外一個宏? // 方法就是:宏傳參給宏,具體的解釋看代碼註釋。 #include <stdio.h> int main(int argc, char *argv[]) { #define WARN_IF(EXPR) \ do \ { \ if (EXPR) \ fprintf(stderr, "Warning: " #EXPR "\n"); \ } while(0) int divider = 0; WARN_IF(divider == 0); #define CHR \xe2\x97\x8f #define PASSWD(x) #x#x#x#x#x#x #define MASK(str) PASSWD(str) // 你本覺得定義2個宏就能完成的功能,PASSWD(CHR),可是並不能完成。 // 那你就再定義一個解釋參數的宏,這樣就ok了。 // 傳給MASK的參數是CHR,可是PASSWD調用的倒是CHR的值。 // 由於宏CHR被展開了。 // 這就叫宏傳參給宏。 printf("passwd:%s\n", MASK(CHR)); return 0; }