RAM中的C ++全局常量而不是ROM

时间:2017-01-12 13:29:02

标签: c++ gcc arm embedded

美好的一天,

我注意到,当我有以下代码时:

int foo(const int arg){
    return arg*10;
}

const int MY_VAR = foo(10);

main(){

    while(true){

    }
}

然后将MY_VAR放在RW数据部分(RAM)中。老实说,我期望编译器错误。我正在使用GNU ARM 6.2 2016q4版本。

如果我制作MY_VAR constexpr,那么我会收到编译错误。如果我按照预期制作foo constexpr,则将MY_VAR放入.text部分(即在ROM中)。

由于constexpr变量不能用作extern,我将不得不使用const变量作为真正的全局常量。

我可以通过哪些方式自动(即编译器警告或错误)检测到常量未分配给ROM?

我确实希望能够使用函数初始化一些const全局变量。虽然我想要捕捉函数不是自动constexpr的情况。

1 个答案:

答案 0 :(得分:3)

使用函数调用的结果初始化常量变量MY_VAR - 这意味着它无法在编译时初始化,因此无法放入ROM中。初始化是在运行时启动应用程序期间完成的。

如果完成此类展示位置,则无法生成警告 - 毕竟,您告诉编译器这样做。

但是,您可以让链接器生成链接映射并手动检查所有常量是否实际上都在适当的段中。