如何在 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>)
我有一个宏将 __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>)