可以从编译时未知的其他地方修改const变量

时间:2018-01-16 14:26:15

标签: c linker compiler-construction const

如果const是一个编译时构造,那就意味着只有编译器会确保例如如果一个变量被声明为const,那么这个变量是只读的并且不会被其余代码修改被编译?

如果const变量是我们代码中的全局变量,并且我们的代码在运行时链接到动态库并尝试写入它,那该怎么办? ,或者如果ISR试图更新它,这不在我们编译的代码中?

我相信编译器可以将const变量标记为加载到只读数据部分,这样可以防止变量的任何变化,但如果它没有变化怎么办?

由于

1 个答案:

答案 0 :(得分:4)

  

编译器将确保例如,如果变量声明为const,则此变量是只读的,并且不会尝试由正在编译的其余代码修改它吗?

是的,就编译器能够分辨而言。如果您的代码尝试写入const - 限定变量,则会出现编译器错误。如果你通过例如抛弃const限定符来躲避类型正确性,那么所有的赌注都会被关闭。

  

如果const变量是我们代码中的全局变量,并且我们的代码在运行时链接到动态库并尝试写入它,那该怎么办? ,或者如果ISR试图更新它,这不在我们编译的代码中?

然后它不应该是const限定的,否则编译器会做出奇怪的假设并生成错误的代码。

但是,存在可以从外部世界更新const变量的情况 - 它可以是只读硬件寄存器或EEPROM存储器单元等。

为防止编译器在这种特殊情况下做出奇怪的假设,您可以合并constvolatile。因此,可以从外部源(例如硬件或ISR)更新的所有变量应始终声明为volatile