链式宏调用。括号中的参数区别对待?

时间:2013-05-09 12:44:55

标签: c macros

#define A(p1, p2, p3, p4) foo(p1, p2, p3, p4)
#define B(s) A(p1, p2, (s), p4)

这里,A()是一个宏绑定,旨在增加可移植性,如果我们需要调用bar(p1,p2,p3,p4)而不想重写整个代码库。

现在我正在尝试定义B()以使我更容易写,因为p1,p2和p4通常具有相同的值。但是,这不起作用,除非我删除s周围的括号。 发生了什么事?我传给A的是什么?


原来:

#define foo(p1, p2, p3, p4) p1 ## p2 ## p3 ## p4()

我不确定p4的定义,但我只有一个有效的值。所以,当我通过而不是s时,我得p1p2而不是p1p2sp4

2 个答案:

答案 0 :(得分:0)

通过尝试找出传递给什么的好方法。你没有说s周围的括号是什么,所以我不知道你期待什么样的错误。以下代码包含您提供的宏定义,并在p1p2p3p4为变量的上下文中使用它们(以便在它们出现时扩展B,他们有价值观。)

#include<stdio.h>

#define A(p1, p2, p3, p4) foo(p1, p2, p3, p4)
#define B(s) A(p1, p2, (s), p4)

void foo( int a, int b, int c, int d ) {
  printf( "%d %d %d %d\n", a, b, c, d );
}

int main() {
  int p1 = 101, p2 = 102, p4 = 104;

  A( 1, 2, 3, 4 );
  B( 7 );

  return 0;
}

此代码编译没有任何问题,并且具有合理的输出。看来括号中的参数与括号内的参数的处理方式不同。

$ gcc -Wall test.c
$ ./a.out 
1 2 3 4
101 102 7 104

答案 1 :(得分:0)

  

所以我传递“(”+ +“)”?对!然后A(实际上通过简单的p1 ## p2 ## p3 ## p4将其输入结合起来)实际上在第三个参数之前停止

是的,然后foo生成

p1 ## p2 ## ( s ) ## p4

并将括号粘贴到p4 resp。 p1 ## p2生成无效令牌,因此整件事被拒绝。

对于令牌粘贴,括号是一个很大的禁忌。