gpt4 book ai didi

c - 类函数宏的错误扩展

转载 作者:行者123 更新时间:2023-12-05 09:11:55 25 4
gpt4 key购买 nike

我对宏有疑问。我应该想出一个宏 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
}

最佳答案

类似函数的宏定义不能有 whitespace在宏名之后

#define ENTRY (a,b) (a[b-1])              // wrong

=>

#define ENTRY(a,b) ((a)[(b)-1])               // correct

6.10 – Preprocessing directives :

...

control-line:
...

# define identifier lparen identifier-listopt ) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list , ... ) replacement-list new-line

...

lparen:
a ( character not immediately preceded by white-space

有了空格,您会得到一个类似对象的宏,它扩展为 (a,b) (a[b-1])

(为了更加稳健,还建议将参数括起来,这样即使您传入更复杂的表达式,它也能正常工作。)

关于c - 类函数宏的错误扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59383345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com