c - 类函数宏的错误扩展
问题描述
我有宏的问题。我应该想出一个宏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 标识符列表, ... )
替换列表换 行...
lparen:
一个(
不紧跟在空格前面的字符
使用空格,您将获得一个类似对象的宏,该宏扩展为(a,b) (a[b-1])
.
(为了额外的稳健性,还建议将参数括起来,以便在传递更复杂的表达式时也可以使用。)
推荐阅读
- matplotlib - xycoords 由数据(x 位置)和图形/轴(y 位置)给出的注释?
- python - 如何截断熊猫数据框中所有列的开头?
- xcode - Applescript 1 分钟后退出
- gmail-api - Gmail API 错误 429“超出用户速率限制”
- node.js - 部署到heroku时出现应用程序错误
- r - 根据应用于列表项的条件获取 df 子集
- reactjs - 在 IIS 上部署 React JS
- tensorflow2.0 - TensorFlow 量化在转换期间崩溃
- reactjs - 反应基本的多元素渲染
- javascript - React / Axios:无法同时在两个对象上设置状态