不能与什么,我认为应该是一个编译时间常数初始化静态数组

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

我试图初始化依据是什么,我认为应该是一个编译时间常数大小的静态数组。

这是很容易可以解决的,但根本没有使用静态的,但我没想到这个问题出现在所有。这可能会导致我在未来等问题。

相关内容:

typedef struct {
    GPIO_TypeDef* Port;
    uint16_t Pin;
} PortPin;

typedef struct {
    I2C_HandleTypeDef *Handle;
    uint16_t Address;
    PortPin Interrupt;
    PortPin Shutdown;
} VL53L1_Dev_t;

//This one is bigger but I've kept it short to keep it readable. It's 3 elements in my code
static VL53L1_Dev_t Sensors[] = {
    {//1
            &hi2c2,
            0x52,
            {
                    GPIOA,
                    GPIO_PIN_11
            },
            {
                    GPIOA,
                    GPIO_PIN_10
            }
    }
}
static const int sensorCount = sizeof(Sensors)/sizeof(Sensors[0]);
static uint8_t encodedData[sensorCount * 2];//Compiler doesn't like this part

由于传感器是完全在编译时定义的,我预计sensorCount也成为一个编译时间常数。这显然不是因为我不能用它来声明和初始化静态数组。我不明白为什么。

c arrays static initialization constants
1个回答
5
投票

在文件范围中声明的数组的大小必须是整数常量表达式。它是在C standard的部分6.6p6定义:

的整数常量表达式应具有整数型和应仅具有是积分常数,枚举常数,字符常数,sizeof表达式,其结果是积分常数,_Alignof表达式和浮点常量是铸件的立即操作数的操作数。在一个整数常量表达式投者应当只转换算术类型为整数类型,除了作为操作数到sizeof_Alignof操作者的一部分。

因此,一个变量的内容,即使申报const,都没有这样的表达式的一部分。

然而,如果你定义sensorCount宏,表达sizeof(Sensors)/sizeof(Sensors[0])是一个编译时间常数。

#define SENSOR_COUNT  (sizeof(Sensors)/sizeof(Sensors[0]))
static uint8_t encodedData[SENSOR_COUNT * 2];
© www.soinside.com 2019 - 2024. All rights reserved.