如何使用一個宏的值做爲參數傳遞給另外一個宏?

// 宏中的#號是字符串化的意思,就是說把宏參數當作一個字符串。
// 可是考慮另外一種需求:咱們要字符串化的參數很長,咱們想用另一個宏代替這個參數。
//                     這樣的話,你字符串化會有問題,
//                     字符串化的是另外一個宏的名字,而不是宏的值。
// 這就出現了本篇要討論的問題:如何使用一個宏的值做爲參數傳遞給另外一個宏?
// 方法就是:宏傳參給宏,具體的解釋看代碼註釋。
#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;
}
相關文章
相關標籤/搜索