是否可以根据 C 中的参数在编译时更改 #define 的行为?

g00*_*dds -2 c preprocessor compile-time c-preprocessor

有这个代码:

// Called when x is "a"
#define do(x) doA()

// Called when x is "b"
#define do(x) doB()
Run Code Online (Sandbox Code Playgroud)

是否可以使预处理器解释do("a")doA()do("b")asdoB()以及其他doUndefined()(如果提供未知)x?澄清一下:我想将x参数映射到任意代码或函数调用,而不仅仅是 call do{uppercase_x}()。它必须在编译时完成。并且x参数必须是字符串。

谢谢!

Tom*_*zes 5

对于带有空格的参数不能这样做。如果没有空格,您可以为每个允许的值定义宏。反过来,这些宏可以扩展为您所需的宏,从而将参数名称与最终宏名称隔离。例如:

#define do(x) do_##x

#define do_a doA
#define do_b doB
Run Code Online (Sandbox Code Playgroud)

然后do(a)将扩展到doA并将do(b)扩展到doB

更新:正如所提到的,paddydo是 C 中的保留关键字,因此您应该为宏选择一个不同的名称。

  • 还没有人说过,但不要忘记“do”是 C 中的保留字。定义一个名为“do”的宏是一个坏主意。 (3认同)