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

时间:2016-01-31 12:51:40

标签: c macros

我有许多格式为

的宏
#define F(A,B)   Some function of A and B

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

#define C A,B

所以我可以说

F(C)

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

2 个答案:

答案 0 :(得分:6)

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

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

#define C A,B

int main(void) {
    F(C)
    F(1,2)
    return 0;
}

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

答案 1 :(得分:0)

宏扩展(错误地)不会触发参数重新计数。因此,任何时候函数调用的宏扩展导致不同数量的参数时,必须强制重新计算参数数量。

使用此模式在调用之前强制扩展和重新计数:

throw new NotImplementedException();