首页 > 解决方案 > 类函数宏的错误扩展

问题描述

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

标签: cmacrosdeclaration

解决方案


类函数宏定义不能在宏名称后有空格

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

=>

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

6.10 – 预处理指令

...

控制线:
...

# define 标识符 lparen identifier-listopt ) 替换列表换行
# define 标识符 lparen ... ) 替换列表换
# define 标识符 lparen 标识符列表 , ... ) 替换列表换

...

lparen:
一个(不紧跟在空格前面的字符

使用空格,您将获得一个类似对象的宏,该宏扩展为(a,b) (a[b-1]).

(为了额外的稳健性,还建议将参数括起来,以便在传递更复杂的表达式时也可以使用。)


推荐阅读