关于定义静态数组和宏的 C 基本问题

C basic question about defining static arrays and macros

提问人:Brinax 提问时间:12/28/2022 最后编辑:Brinax 更新时间:12/29/2022 访问量:47

问:

我正在尝试定义一些数组,这是我的代码:

#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|

有人有答案吗?

编译器 静态 语法错误 c-预处理器

评论

3赞 Some programmer dude 12/29/2022
#define int N=50;?这不是宏的定义方式。
1赞 Gerhardh 12/29/2022
根据你的宏定义,你最终会得到这条线:看起来不像你想要的。N=50; main()
3赞 Some programmer dude 12/29/2022
和?数组元素的类型是什么?static u[size], ...;
1赞 Andreas Wenzel 12/29/2022
@Brinax:你是不是也换成了?如果您进行我提到的两个更改,那么我相信您的代码将编译。#define int N=50;#define N 50
1赞 Some programmer dude 12/29/2022
请不要“修复”问题中的代码。这将消除问题,使您的问题和问题看起来毫无用处。

答:

0赞 Maty 12/29/2022 #1

让我们举个例子。如果开始用宏替换文本,将发生以下情况:u[size]

-> u[size]

-> u[(N+2)*(N+2)]

就是这样......也就是说,它不是一个常量,因为不是一个常量(并且未定义)。N

现在,如果我们接受您建议的答案,它应该可以工作。我认为你可能有的是.注意末尾的分号。如果将上面的最后一行替换为该宏,则新结果将为:#define N 50;

-> u[(50;+2)*(50;+2)]

这是无效的语法。

您缺少的最后一件事是声明中的类型。可能想把或其他类型放在 之后。intstatic

您似乎缺少宏的基本原理。你的第一个宏很糟糕,非常糟糕。每当在它下面的代码中提到该单词时,它都会被替换为 .#define int N=50intN=50

评论

0赞 Brinax 12/29/2022
我仍然有错误:|2|error: expected ';', ',' or ')' before numeric constant|
0赞 Maty 12/29/2022
删除。此宏将关键字替换为 everywhere。在预处理器步骤之后,函数签名将如下所示#define int N=50;intN=50;mainN=50; main()
1赞 Some programmer dude 12/29/2022
@Brinax 检查错误消息中报告的行。我敢打赌这不是你所期望的。如果定义为宏,则考虑 会发生什么。intint main()
0赞 Brinax 12/29/2022
@Someprogrammerdude错误在第 2 行:“”#define N 50 “''
1赞 Maty 12/29/2022
@Brinax一件事,要小心宏。预处理器步骤发生在编译之前,因此得名,您的宏将“更改”您的代码,因此您的编译错误可能有点隐晦或具有误导性。在我对宏更加熟悉之前,我会先写出整行代码(没有宏),然后开始一次拉出一个宏。