C语言 “在文件范围内可变地修改了'variable_name'”,大小在宏中定义[重复]

6l7fqoea  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(64)

此问题在此处已有答案

C fixed size array treated as variable size(2个答案)
三年前就关门了。
我知道有一些问题与此错误有关:
question 1question 2question 3question 4,...
不同的是,我不使用变量来定义大小,而是使用宏。
我是这样做的:

#define     SIZE_A      250                      // Real world value
#define     SIZE_B       80                      // Real world value
#define     SCALE         0.25                   // Real world value
#define     TOTAL_A     (uint16_t)(SIZE_A/SCALE)
#define     TOTAL_B     (uint16_t)(SIZE_B/SCALE)
#define     TOTAL       TOTAL_A*TOTAL_B

#define     SIZE_1      (uint16_t)(TOTAL*0.3)

#define     SIZE_2      4000

typedef struct {
    toto_t  toto[TOTAL_A][TOTAL_B];
    foo_t   foo[SIZE_1][SIZE_2];
} bar_t;

字符串
正如你所看到的,我有三个宏(SIZE_ASIZE_BSCALE),它们代表真实的东西。从这些我定义的大小(TOTAL_ATOTAL_B)的2维数组(toto_t toto),并在这个数组中的细胞总数(TOTAL)。然后我从总数中取一部分(SIZE_1)来定义我想创建的另一个数组的大小(foo_t foo)。
这样,GCC就会抛出错误:Variably modified 'foo' at file scope。因此,我查看了预处理器的输出:

typedef struct {
    toto_t toto[(uint16_t)(250/0.25)][(uint16_t)(80/0.25)];
    foo_t  foo[(uint16_t)((uint16_t)(250/0.25)*(uint16_t)(80/0.25)*0.3)][4000];
} bar_t;


正如我们所看到的,预处理器做得很好。所有宏都被替换为文字值。所以数组大小中只有常量值。

我的问题

为什么GCC不能计算数组的大小?有没有一个选项可以强制它进行计算?
我使用这个选项-O3 -Wall -Wextra -Werror编译。
测试:
创建一个test.h,并将我发布的代码添加到开头。然后创建一个test.c文件:

#include <stdio.h>
#include <inttypes.h>

#include "test.h"

int main() {
    printf("hello world\n");

    return 0;
}

mrfwxfqh

mrfwxfqh1#

这里的问题是SCALE的浮点值。
你可以使用定点值来避免它:

#define     SIZE_A      250                      // Real world value
#define     SIZE_B       80                      // Real world value
#define     SCALE         25                   // Real world value
#define     TOTAL_A     (SIZE_A*100/SCALE)
#define     TOTAL_B     (SIZE_B*100/SCALE)
#define     TOTAL       TOTAL_A*TOTAL_B

#define     SIZE_1      (TOTAL*3/10)

#define     SIZE_2      4000

typedef struct {
    toto_t  toto[TOTAL_A][TOTAL_B];
    foo_t   foo[SIZE_1][SIZE_2];
} bar_t;

字符串
This answer将给予有关C标准规则的所有信息。

相关问题