Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 可以从编译时未知的其他地方修改常量变量吗_C_Linker_Compiler Construction_Constants - Fatal编程技术网

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

C 可以从编译时未知的其他地方修改常量变量吗,c,linker,compiler-construction,constants,C,Linker,Compiler Construction,Constants,如果const是编译时构造,这意味着只有编译器才能确保,例如,如果一个变量被声明为const,那么这个变量是只读的,并且被编译的其余代码不会试图修改它 如果一个常量变量在我们的代码中是一个全局变量,并且我们的代码在运行时链接到一个试图写入它的动态库,那该怎么办,或者如果ISR试图更新它,而这不在我们编译的代码中 我相信编译器可以将const变量标记为加载到只读数据段中,这将阻止变量的任何更改,但是如果它不这样做呢 谢谢 编译器将确保,例如,如果一个变量被声明为const,那么这个变量是只读的,并

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

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

我相信编译器可以将const变量标记为加载到只读数据段中,这将阻止变量的任何更改,但是如果它不这样做呢

谢谢

编译器将确保,例如,如果一个变量被声明为const,那么这个变量是只读的,并且不会被编译的其余代码试图修改

是的,据编译器所知。如果您的代码试图写入一个
const
限定变量,您将得到一个编译器错误。如果您通过例如丢弃常量限定符来规避类型正确性,那么所有赌注都将被取消

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

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

然而,在某些情况下,
const
变量可能会从外部更新-它可能是只读硬件寄存器或EEPROM存储单元等


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

const
可能是编译时常量或运行时常量。这取决于上下文。至于您的问题,如果您出于任何原因放弃了
常量
,那么您可以从您自己的代码或第三部分代码中打开自己,因为它可能会试图修改数据。只要不要丢弃常量,你应该(相对)安全。当然,没有什么可以阻止第三方代码将其丢弃,但这超出了您的控制范围,并将导致UB。如果外部修改声明为
const
(而不是
const volatile
)的变量,则行为未定义。没有“如果”第三方库如何在不丢弃常量的情况下写入您的常量数据?除非你提供数据,否则它怎么知道你的数据?如果您使用
const
限定符提供它,那么您应该期望库不会做坏事并尝试修改数据。如果它试图修改常量数据,那么你应该扔掉它,永远不要再使用它(当然,在通知作者这个问题之后)。@Engineer999它可以。但是这种行为还没有定义。“未定义行为”一词的用途之一是对假设问题有一个很好的默认答案。如果有人做了不合理的事情,C标准不能保证程序以任何合理的方式运行。您正在一个允许做任何事情的环境中运行。未知的动态库可能正在重写函数的代码。当不合理的事情发生时,合理的结果是无法保证的。修改常量限定对象是不合理的事情之一。实际规则是,试图修改定义为常量限定的对象是未定义的。一个函数可以被传递一个指向const限定类型的指针,如果原始对象不是用const定义的,那么该函数可能会丢弃const并修改该对象。我的理解是,const仅用于编译器,因此它将确保我们不会尝试在代码中的任何地方写入变量?然而,编译器在访问常量变量时是否也会生成特殊的汇编代码,以确保它是只读的?@Engineer999,这取决于系统,有时取决于变量范围。在纯基于RAM的系统(如PC)上,
const
主要供程序员使用。例如,在带有真正闪存ROM的微控制器上,
const
关键字将意味着变量将在ROM而不是RAM中结束。除非它有局部作用域,否则它可能会或可能不会在ROM中结束。