提问人:Brinax 提问时间:12/28/2022 最后编辑:Brinax 更新时间:12/29/2022 访问量:47
关于定义静态数组和宏的 C 基本问题
C basic question about defining static arrays and macros
问:
我正在尝试定义一些数组,这是我的代码:
#include <stdio.h>
#define int N=50;
#define size (N+2)*(N+2)
#define IX(i,j) ((i)+(N+2)*(j))
#define SWAP(x0,x) {float *tmp=x0;x0=x;x=tmp;}
int main()
{
static float u[size], v[size], u_prev[size], v_prev[size];
}
它在编译时说:
|9|error: storage size of 'u' isn't constant|
如果我更改 #define int N=50;#define N 50 它说:
|2|error: expected ';', ',' or ')' before numeric constant|
有人有答案吗?
答:
0赞
Maty
12/29/2022
#1
让我们举个例子。如果开始用宏替换文本,将发生以下情况:u[size]
-> u[size]
-> u[(N+2)*(N+2)]
就是这样......也就是说,它不是一个常量,因为不是一个常量(并且未定义)。N
现在,如果我们接受您建议的答案,它应该可以工作。我认为你可能有的是.注意末尾的分号。如果将上面的最后一行替换为该宏,则新结果将为:#define N 50;
-> u[(50;+2)*(50;+2)]
这是无效的语法。
您缺少的最后一件事是声明中的类型。可能想把或其他类型放在 之后。int
static
您似乎缺少宏的基本原理。你的第一个宏很糟糕,非常糟糕。每当在它下面的代码中提到该单词时,它都会被替换为 .#define int N=50
int
N=50
评论
0赞
Brinax
12/29/2022
我仍然有错误:|2|error: expected ';', ',' or ')' before numeric constant|
0赞
Maty
12/29/2022
删除。此宏将关键字替换为 everywhere。在预处理器步骤之后,函数签名将如下所示#define int N=50;
int
N=50;
main
N=50; main()
1赞
Some programmer dude
12/29/2022
@Brinax 检查错误消息中报告的行。我敢打赌这不是你所期望的。如果定义为宏,则考虑 会发生什么。int
int main()
0赞
Brinax
12/29/2022
@Someprogrammerdude错误在第 2 行:“”#define N 50 “''
1赞
Maty
12/29/2022
@Brinax一件事,要小心宏。预处理器步骤发生在编译之前,因此得名,您的宏将“更改”您的代码,因此您的编译错误可能有点隐晦或具有误导性。在我对宏更加熟悉之前,我会先写出整行代码(没有宏),然后开始一次拉出一个宏。
评论
#define int N=50;
?这不是宏的定义方式。N=50; main()
static u[size], ...;
#define int N=50;
#define N 50