我正在处理的一些遗留代码有一个宏,它返回一个以逗号分隔的列表,用作函数参数。这很难看,但配置文件包含很多这些,现在很难改变。
#define XY1 0,0
#define XY2 1,7
...
void fun_point(x,y);
fun_point(XY1);
只要它是一个被调用的函数,它就可以正常工作。但是,当尝试使用参数调用另一个宏时,整个字符串被视为一个参数,而不是将逗号分成两个参数
#define MAC_POINT(x,y) (x+y)
MAC_POINT(XY1) #not expanded by preprocessor
是否有解决此问题的方法而不更改XY定义?
答案 0 :(得分:13)
有点儿。以下作品:
#define MAC_POINT(x,y) (x+y)
#define MAC_POINT1(xy) MAC_POINT(xy)
#define XY x,y
MAC_POINT(x,y)
MAC_POINT1(XY)
但是,如果只有一个参数,则必须从MAC_POINT更改为MAC_POINT1。
另一种可能性是:
#define MAC_POINT(x,y) (x+y)
#define MAC_POINT1(xy) MAC_POINT xy
#define XY x,y
MAC_POINT1((x,y))
MAC_POINT1((XY))
现在你必须改变你对宏的所有调用,但至少它们是一致的。