我正在生成一些编译时代码。我需要根据宏布尔值将后缀附加到生成的函数名称中。后缀可以存在也可以为空。该怎么做?
#define FUNC_NAME(name, hasSuffix) name ## MAYBE_SHOW_SUFFIX(hasSuffix)
FUNC_NAME(foo, true); // would generate: foo_
FUNC_NAME(foo, false); // would generate: foo
我正在生成一些编译时代码。我需要根据宏布尔值将后缀附加到生成的函数名称中。后缀可以存在也可以为空。该怎么做?
#define FUNC_NAME(name, hasSuffix) name ## MAYBE_SHOW_SUFFIX(hasSuffix)
FUNC_NAME(foo, true); // would generate: foo_
FUNC_NAME(foo, false); // would generate: foo
利用宏扩展的结果再次扩展:
结果
https://godbolt.org/z/EEM938jx9
请注意,这仅在扩展宏
WITHSUFFIX_true
或WITHSUFFIX_false
给定条件true
或false
完全时才有效。它不适用于其他值,例如1
或!0
或类似值。一个有点过度设计的替代方案是允许这两种形式(并且只能允许这两种形式):
当调用宏等
suffix
时,您希望调用者输入的任何内容可能在哪里。true
我们可以将其写成:
如果没有参数,则
__VA_ARGS__
归结为无。否则,它将变成调用者在此处输入的任何内容,希望suffix
这是此处唯一有效的输入(否则将出现编译器错误)。然后我们定义一个在没有额外参数时调用的宏,它只调用该函数:
还有一个附加后缀的宏。假设我们有一些宏
#define SUFFIX _
,我们需要一些辅助宏在标记连接之前进行扩展:完整示例:
输出: