此问题在此处已有答案:
C fixed size array treated as variable size(2个答案)
三年前就关门了。
我知道有一些问题与此错误有关:
question 1,question 2,question 3,question 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_A
,SIZE_B
,SCALE
),它们代表真实的东西。从这些我定义的大小(TOTAL_A
,TOTAL_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;
}
型
1条答案
按热度按时间mrfwxfqh1#
这里的问题是SCALE的浮点值。
你可以使用定点值来避免它:
字符串
This answer将给予有关C标准规则的所有信息。