初始化元素不是常量

Moh*_*ram 5 c embedded initialization constants

我想创建向量表来为 MCU 创建启动代码,当我尝试将函数地址放入向量表时,编译器会产生错误:initialiser element is not constant

void reset_handler(void);

uint32_t const vector_table[] = {
    STACK_START,
    (uint32_t)&reset_handler
};

void rest_handler(void)
{
}
Run Code Online (Sandbox Code Playgroud)

我总是使用函数指针类型来创建函数数组,但是这次我想知道为什么当我使用uint32_t类型数组时我不能将函数的地址放入其中

Vla*_*cow 3

来自 C 标准(6.6 常量表达式)

6 整型常量表达式117) 应具有整型类型,并且只能具有整型常量、枚举常量、字符常量、结果为整型常量的 sizeof 表达式以及作为强制转换的直接操作数的浮点常量的操作数。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,除非作为 sizeof 运算符的操作数的一部分

用于初始化整数的带有强制转换运算符的此表达式(uint32_t)&reset_handler不正确,因为强制转换运算符的操作数不具有算术类型。因此它不能用于初始化具有静态存储持续时间的整数对象(整数数组的元素)。

所以编译器会发出错误

initialiser element is not constant
Run Code Online (Sandbox Code Playgroud)

例如,您可以将数组声明从 main 中的文件范围中移动。在这种情况下,数组将具有自动存储期限。尽管如此,无论如何,将(uint32_t)&reset_handler函数指针转换为该类型的整数uint32_t都是错误的。

  • @0___________ 你认为编译器为什么会发出错误? (2认同)