在C++预处理器中将参数拆分

9
我正在处理一些遗留代码,其中有一个宏返回一个逗号分隔的列表,旨在用作函数参数。虽然这很丑陋,但配置文件中包含了许多这样的列表,现在更改将会很困难。
#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的定义?

2
我对遗留代码摇了摇拳头。 - icabod
1
我在GCC手册中找到了关于这个问题的讨论:http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan - Quantum7
1个回答

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))

现在你需要修改所有使用该宏的调用,但至少它们是一致的。


啊,我想我明白为什么需要额外的间接层了。谢谢! - Quantum7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接