【发布时间】:2014-04-30 10:11:32
【问题描述】:
是否可以定义一个预处理器宏,它将以下列方式扩展。
MACRO1(x) (y,z,w)
--> MACRO2(x,y,z,w)
MACRO1 的扩展能否以某种方式消耗宏调用之后的列表的左括号并将其替换为MACRO2(x,,以便预处理器将结果作为有效的宏调用接受(假设MACRO2 已定义)而不是引发unterminated argument list 错误?
我尝试过这样做
#define STRANGE_MACRO(...) __VA_ARGS__
#define STRIP_PAREN(...) __VA_ARGS__)
#define PREPEND_AND_APPLY_STRANGE(x) STRANGE_MACRO(x,STRIP_PAREN
这样称呼它:
PREPEND_AND_APPLY_STRANGE(x) (y,z,w)
产生unerminated argument list 错误。有没有办法让它工作?
至于我想要这种行为的原因,它是为了 esetics,我认为这样的宏调用看起来更好
MACRO1(identifier) (
more
complex
arguments
)
比
MACRO2(identifier,
more
complex
arguments
)
我只想将前者转变为后者。如果在预处理器规则内不可能,没什么大不了的,我会接受它,但如果是的话,我想知道诀窍。
【问题讨论】:
-
你对“美学”的看法 [原文如此] 与我的完全不同。 :) 如果是宏调用,它应该看起来像一个,而不是语法错误。
-
您可能正在寻找something like that
标签: c++ c c-preprocessor