我有许多格式为
的宏#define F(A,B) Some function of A and B
为了便于阅读,我想为这些宏定义参数,例如
#define C A,B
所以我可以说
F(C)
但预处理器尝试在C之前扩展F并抱怨F需要2个参数。有没有办法让它在扩展F之前扩展C,以便不会发生错误?
答案 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();