Try*_*hon 2 c arrays static initialization constants
我正在尝试初始化一个静态数组,其大小基于我认为应该是编译时常量.
这很容易修复,但根本就不使用静态,但我没想到这个问题会出现.这可能会在未来引起我的其他问题.
相关部分:
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
Run Code Online (Sandbox Code Playgroud)
由于传感器在编译时完全定义,我期望sensorCount也是编译时常量.这显然不是因为我不能用它来声明和初始化静态数组.我不明白为什么.
在文件范围声明的数组大小必须是整数常量表达式.它在C标准的第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];
Run Code Online (Sandbox Code Playgroud)