-1
#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) 而不是 s 时,我得到p1p2的是p1p2sp4.

4

2 回答 2

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
于 2013-05-09T12:55:37.850 回答
0

所以我通过“(” + +“)”?正确的!然后 A (实际上通过 simple 连接它的输入p1 ## p2 ## p3 ## p4)实际上在第三个参数之前停止

是的,然后foo产生

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

并将括号粘贴到p4相应的位置。p1 ## p2产生无效的令牌,因此整个事情都被拒绝了。

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

于 2013-05-09T13:02:36.660 回答