#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
。
答案 0 :(得分:0)
通过尝试找出传递给什么的好方法。你没有说s
周围的括号是什么,所以我不知道你期待什么样的错误。以下代码包含您提供的宏定义,并在p1
,p2
,p3
和p4
为变量的上下文中使用它们(以便在它们出现时扩展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
生成无效令牌,因此整件事被拒绝。
对于令牌粘贴,括号是一个很大的禁忌。