4

我的程序中有一个函数,它需要 3 个参数。有时在代码中有一个宏定义了其中的 2 个参数。

所以这:

void func(int x, int y, int z){...}

可以这样调用:

#define PAR 10,20
int z = 3;
func(PAR, z);

现在,我需要更改我的代码,以便像调用另一个函数的宏一样调用该函数。

#define func(X,Y,Z) func2(X,Y,Z,#Z)

如果 X 和 Y 真的作为变量传递,这很好用。有没有办法让它也适用于宏 PAR?

我正在使用 GCC 4.6

4

2 回答 2

4

您可以通过额外的间接级别来做到这一点,(ab)使用可变参数宏:

#include <stdio.h>
#define PAR 2,3
#define F(...) G(__VA_ARGS__)
#define G(a,b,c) H(a,b,c)
void H(int a, int b, int c) {
  printf("%d %d %d\n", a , b, c);
}
int main() {
  F(PAR, 42);
  return 0;
}

对于潜在的问题,可能有更好的解决方案。

于 2015-04-28T00:56:02.383 回答
2

不,我不相信。当你定义

#define func(X,Y,Z) func2(X,Y,Z,#Z)

您正在定义一个类似函数的宏func(X,Y,Z)实际上接受三个参数 -它必须接受三个参数。请记住,预处理器不是编译器正在解释func(PAR, Z)

我一直在努力寻找任何文档,但是预处理器要做的第一件事(考虑到func()是外部元素)是检查func()的参数是否有效是有道理的。然后它将参数放入func2()中,然后扩展作为参数传递的任何宏。我在下面放置的代码似乎支持了这一说法。

按照这个逻辑,预处理器会看到func(PAR, Z)不是一个有效的调用,因为缺少一个参数,然后会抛出错误

13:12: error: macro "func" requires 3 arguments, but only 2 given

只要XY是有效的宏或变量,func(X, Y, Z)就可以工作。

代码(这会给你警告,因为没有函数声明,但输出将是预期的“ 3 14 3 ”):

#include <stdio.h>
#include <stdlib.h>

#define PAR 10,20
#define MAR 3
#define WAR 14
#define func(X,Y,Z) print(X, Y, Z)

int Z = 3;

int main(void){

        func(MAR,WAR,Z);

        return 0;
}

void print(int x, int y, int c){

        printf("%d %d %d\n", x, y, c);

}

出于好奇,你为什么要这样做(我还没有足够的声誉来发表评论,仅供参考)。

于 2015-04-28T00:20:41.230 回答