有没有办法强制C预处理器在宏之前评估宏参数

use*_*568 4 c macros

我在表单中有许多宏

#define F(A,B)   Some function of A and B
Run Code Online (Sandbox Code Playgroud)

为了便于阅读,我想为这些宏定义参数,例如

#define C A,B
Run Code Online (Sandbox Code Playgroud)

所以我可以说

F(C)
Run Code Online (Sandbox Code Playgroud)

但预处理器尝试在C之前扩展F并抱怨F需要2个参数.有没有办法让它在扩展F之前扩展C,以便不会发生错误?

250*_*501 6

您可以使用带有可变数量参数的中间宏:

#define F1(A,B) 
#define F(...) F1(__VA_ARGS__)

#define C A,B

int main(void) {
    F(C)
    F(1,2)
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这应该编译.如果传递多于或少于两个参数,或者没有扩展到两个参数的参数,您仍会遇到编译失败.