“文件范围内的变量'variable_name',在宏中定义了大小

问题描述 投票:0回答:1

我知道与此错误有关的一些问题:thread1thread2thread3thread4,...

不同之处在于,我不使用变量来定义大小,而是使用宏。

这是我的工作:

#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_A)的大小(TOTAL_Btoto_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无法计算数组的大小?是否有强制执行计算的选项?

编辑Usefull info,我使用此选项-O3 -Wall -Wextra -Werror进行编译。

无用信息 Jabberwocky提问:

创建test.h并放置我发布的代码,并在开头添加typedef uint16_t toto_t; typedef uint16_t foo_t;。并使用以下命令创建一个test.c文件:

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

#include "test.h"

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

    return 0;
}
c arrays gcc macros size
1个回答
0
投票

这里的问题是标度的浮动值。

您可以使用定点值避免它:

#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;
© www.soinside.com 2019 - 2024. All rights reserved.