如果const是一个编译时构造,那就意味着只有编译器会确保例如如果一个变量被声明为const,那么这个变量是只读的并且不会被其余代码修改被编译?
如果const变量是我们代码中的全局变量,并且我们的代码在运行时链接到动态库并尝试写入它,那该怎么办? ,或者如果ISR试图更新它,这不在我们编译的代码中?
我相信编译器可以将const变量标记为加载到只读数据部分,这样可以防止变量的任何变化,但如果它没有变化怎么办?
由于
答案 0 :(得分:4)
编译器将确保例如,如果变量声明为const,则此变量是只读的,并且不会尝试由正在编译的其余代码修改它吗?
是的,就编译器能够分辨而言。如果您的代码尝试写入const
- 限定变量,则会出现编译器错误。如果你通过例如抛弃const限定符来躲避类型正确性,那么所有的赌注都会被关闭。
如果const变量是我们代码中的全局变量,并且我们的代码在运行时链接到动态库并尝试写入它,那该怎么办? ,或者如果ISR试图更新它,这不在我们编译的代码中?
然后它不应该是const限定的,否则编译器会做出奇怪的假设并生成错误的代码。
但是,存在可以从外部世界更新const
变量的情况 - 它可以是只读硬件寄存器或EEPROM存储器单元等。
为防止编译器在这种特殊情况下做出奇怪的假设,您可以合并const
和volatile
。因此,可以从外部源(例如硬件或ISR)更新的所有变量应始终声明为volatile
。