簡體   English   中英

如何在C中連接宏

[英]How to concat macros in C

我有一個宏,它以數字字符串文字形式顯示__DATE__的月份:

#define MONTH (\
  __DATE__[2] == 'n' ? (__DATE__[1] == 'a' ? "01" : "06") \
: __DATE__[2] == 'b' ? "02" \
: __DATE__[2] == 'r' ? (__DATE__[0] == 'M' ? "03" : "04") \
: __DATE__[2] == 'y' ? "05" \
: __DATE__[2] == 'l' ? "07" \
: __DATE__[2] == 'g' ? "08" \
: __DATE__[2] == 'p' ? "09" \
: __DATE__[2] == 't' ? "10" \
: __DATE__[2] == 'v' ? "11" \
: "12")

這可以正常工作並產生我要尋找的月份。 printf("%s", MONTH); 但是,我試圖將其添加到更大的一組宏中,並且遇到了麻煩:

#define MYMONTH "M" MONTH

現在應該產生字符串: M11 但相反,它會產生以下編譯器錯誤:

error: called object is not a function or function pointer
#define MYMONTH   "M" MONTH

我知道您可以通過附加字符串文字和宏來組合它們:

#define COMMA ","
#define EXCLA "!"
#define MYSTR "Hello" COMMA " world" EXCLA

但是,當涉及邏輯時,為什么它不起作用?

宏只是在預處理中完成的字符串復制。

如果我們將您的MONTH宏復制到MYMONTH得到:

#define MYMONTH "M" (\
  __DATE__[2] == 'n' ? (__DATE__[1] == 'a' ? "01" : "06") \
: __DATE__[2] == 'b' ? "02" \
: __DATE__[2] == 'r' ? (__DATE__[0] == 'M' ? "03" : "04") \
: __DATE__[2] == 'y' ? "05" \
: __DATE__[2] == 'l' ? "07" \
: __DATE__[2] == 'g' ? "08" \
: __DATE__[2] == 'p' ? "09" \
: __DATE__[2] == 't' ? "10" \
: __DATE__[2] == 'v' ? "11" \
: "12")

對編譯器來說,您正在嘗試使用"M"(<some string here>)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM