[英]Incorrect expansion of a function-like macro
晚上好,
我的宏有问题。 我应该想出一个宏ENTRY
,它将一个值放入一个数组中(给出了scanf("%d",&ENTRY(x,i))
)。
我试过: #define ENTRY (a,b) (a[b-1])
,但这没有用。
它创建了一个编译器错误,指出 a 和 b 未声明。
但我认为我不必声明宏中使用的变量,尤其是因为,例如: #define min (a,b) ((a)<(b)?(a):(b))
在另一个程序。
那么我在这里做错了什么?
#include <stdio.h>
#define N 3
#define ENTRY (a,b) (a[b-1])
int main(void)
{
int x[N],i;
float y[N];
for(i=1;i<=N;i++){ printf("x_%d = ",i);scanf("%d",&ENTRY(x,i));}
for(i=1;i<=N;i++){ printf("y_%d = ",i);scanf("%lf",&ENTRY(y,i));}
return 0
}
类似函数的宏定义在宏名称后不能有空格
#define ENTRY (a,b) (a[b-1]) // wrong
=>
#define ENTRY(a,b) ((a)[(b)-1]) // correct
...
控制线:
...
# define
标识符lparen identifier-listopt)
替换列表换行
# define
标识符lparen... )
替换列表换行
# define
标识符lparen identifier-list, ... )
替换列表换行...
lparen:
a(
字符前面没有空格
使用空间,您将获得一个类似对象的宏,该宏扩展为(a,b) (a[b-1])
。
(为了额外的健壮性,还建议将参数括起来,以便在您传入更复杂的表达式时也能正常工作。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.