【发布时间】:2018-01-16 14:26:15
【问题描述】:
如果 const 是编译时构造,则意味着只有编译器会确保,例如,如果将变量声明为 const,则该变量是只读的,并且不会尝试被其余代码修改正在编译?
如果 const 变量是我们代码中的全局变量,并且我们的代码在运行时链接到试图写入它的动态库,那该怎么办? ,或者如果 ISR 尝试更新它,这不在我们编译的代码中?
我相信编译器可以将 const 变量标记为加载到只读数据部分,这样可以防止变量发生任何变化,但如果不这样做呢?
谢谢
【问题讨论】:
-
const可能是编译时常量或运行时常量。这取决于上下文。 -
至于您的问题,如果您出于任何原因抛弃了
const,那么您可以从您自己的代码或第三方代码中打开undefined behavior,因为它可能会尝试修改数据。只是不要抛弃const,你应该(相对)安全。当然,没有什么能阻止第三方代码将其丢弃,但这是你无法控制的,并且会导致 UB。 -
如果外部修改了声明为
const(而不是const volatile)的变量,则行为未定义。没有“假设” -
第三方库如何在不丢弃
const的情况下写入您的常量数据?除非您提供,否则它怎么会知道您的数据?如果您使用const限定符提供它,那么您应该期望该库不会做坏事并尝试修改数据。如果它试图修改常量数据,那么你应该把它扔掉,永远不要再使用它(当然是在通知作者这个问题之后)。 -
@Engineer999 可以。但随后行为是未定义的。 “未定义行为”一词的用途之一是对假设问题有一个很好的默认答案。如果有人做了不合理的事情,C 标准不保证程序以任何合理的方式运行。你在一个允许事情做任何事情的环境中运行。未知的动态库可能正在为您的函数重写代码。当不合理的事情发生时,无法保证合理的结果。修改一个 const 限定的对象是不合理的事情之一。
标签: c linker compiler-construction constants