我试图初始化依据是什么,我认为应该是一个编译时间常数大小的静态数组。
这是很容易可以解决的,但根本没有使用静态的,但我没想到这个问题出现在所有。这可能会导致我在未来等问题。
相关内容:
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 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];