C 宏:Select 宏使用字符串和数字的串联
C Macros: Select macro using concatenation of string and number
我有大量以数字结尾的宏(不是我的):
#define MACRO_1 do_something1();
#define MACRO_2 do_something2();
#define MACRO_3 do_something3();
.
.
使用这些辅助宏:
#define TO_STRING(x) #x
#define SELECT_MACRO(id) "MACRO_"TO_STRING(id)
我希望能够 select 所需的宏,例如我正在这样做:SELECT_MACRO(3)
,问题是它被翻译成 "MACRO_""3"
由于此字符串中的双引号,我在代码中使用某些 API 时遇到问题。
有没有办法让它不带引号?
您可以使用 token concatenation 运算符 ##
:
#define SELECT_MACRO(id) MACRO_##id
由此 SELECT_MACRO(1)
扩展为 MACRO_1
。
顺便说一句:
it's translated to "MACRO_""3"
and I have a problem [...] due to the double quotes inside this string.
字符串中没有双引号。它是一个字符串 "MACRO_3"
。相邻的字符串文字(此处 "MACRO_"
和 "3"
)被连接起来(在预处理之后)。
我有大量以数字结尾的宏(不是我的):
#define MACRO_1 do_something1();
#define MACRO_2 do_something2();
#define MACRO_3 do_something3();
.
.
使用这些辅助宏:
#define TO_STRING(x) #x
#define SELECT_MACRO(id) "MACRO_"TO_STRING(id)
我希望能够 select 所需的宏,例如我正在这样做:SELECT_MACRO(3)
,问题是它被翻译成 "MACRO_""3"
由于此字符串中的双引号,我在代码中使用某些 API 时遇到问题。
有没有办法让它不带引号?
您可以使用 token concatenation 运算符 ##
:
#define SELECT_MACRO(id) MACRO_##id
由此 SELECT_MACRO(1)
扩展为 MACRO_1
。
顺便说一句:
it's translated to
"MACRO_""3"
and I have a problem [...] due to the double quotes inside this string.
字符串中没有双引号。它是一个字符串 "MACRO_3"
。相邻的字符串文字(此处 "MACRO_"
和 "3"
)被连接起来(在预处理之后)。