(C99)在不同的宏中展开宏

时间:2015-04-27 23:05:28

标签: c macros gcc4.6

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

所以这个:

ls -lsa /usr/local/php5-5.6.8-20150417-141945/lib/php/peclcmd.php 
4 -rw-r--r-- 1 root wheel 1022 Apr 17 08:19 /usr/local/php5-5.6.8-20150417-141945/lib/php/peclcmd.php

可以像这样调用:

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

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

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

如果X和Y真的作为变量传递,这可以正常工作。有没有办法让它与宏PAR一起工作?

我正在使用GCC 4.6

2 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:2)

不,我不相信。定义时

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

您正在定义function-like macro func(X,Y,Z)实际上需要三个参数 - and it has to take three arguments。请记住,预处理器不是编译器正在解释 func(PAR,Z)

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

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

13:12: error: macro "func" requires 3 arguments, but only 2 given
只要 X Y 是有效的宏或变量,

func(X,Y,Z)就会有效。

代码(这会给你警告,因为没有功能声明,但输出将是&#34; 3 14 3 &#34;正如预期的那样) :

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

}

出于好奇,你为什么这样做(我没有足够的声誉来评论FYI)。