(C99)在其他宏中展开宏

(C99)在其他宏中展开宏,c,macros,gcc4.6,C,Macros,Gcc4.6,我的程序中有一个函数,它有3个参数。有时代码中有一个宏定义了其中的两个参数 因此: 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?一起工作? 我使用的是GC

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

因此:

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?

一起工作?
我使用的是GCC4.6,不,我不这么认为。当你定义

#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
func(X,Y,Z)只要XY是有效的宏或变量,就可以工作

代码(这将向您发出警告,因为没有函数声明,但输出将如预期的那样为“3 14 3”):

#包括
#包括
定义PAR10、20
#定义3月3日
#定义战争14
#定义函数(X,Y,Z)打印(X,Y,Z)
int Z=3;
内部主(空){
func(三月,战争,Z);
返回0;
}
无效打印(整数x、整数y、整数c){
printf(“%d%d%d\n”,x,y,c);
}

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

你可以使用可变变量进行额外的间接(ab)操作 宏:

#包括
定义PAR 2,3
#定义F(…)G(_VA_ARGS__;)
#定义G(a,b,c)H(a,b,c)
空H(整数a、整数b、整数c){
printf(“%d%d%d\n”,a、b、c);
}
int main(){
F(第42段);
返回0;
}

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

也许是,也许不是。我知道的是你不应该这么做…如果你添加一层间接寻址并在另一个宏体中调用
func
,考虑到在扩展代码“<代码> FUNC< /代码>”之前,不能计算参数的数量,除非它将变量替换为包装宏的主体,否则将不能被扩展器标识,此时“代码> PAR < /代码>已经被扩展了。(当然,如果它是作为参数传递给包装器的),则更改那里的参数数量以计数。
#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);

}
#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;
}