【发布时间】:2017-01-12 13:29:02
【问题描述】:
早安,
我注意到当我有以下代码时:
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 的情况。
【问题讨论】:
-
常量
MY_VAR是一个全局变量。它在 RAM 中分配 -
ROM 与 RAM 的只读部分不同。
-
如果你把它编译成标准C,你确实会得到一个编译器错误。经验丰富的老手在程序发布之前总是需要一些时间来阅读地图文件,看看是否有什么可疑的东西最终进入了 RAM。
-
OP 指定他想在其他源文件中声明变量
extern,所以不,它不适用于constexpr。 -
@gmug:这是错误的。该语言不需要这样做,编译器(或链接器)会尽可能将它们放在 ROM 中。由于函数调用,这是不可能的。