是否有一种优雅的方式来强制比较两个常量?

vsz*_*vsz 27 c

众所周知,以下代码将由所有合理的编译器优化:

const int a = 3;
const int b = 42;

if (a == b)
{
    do_something();
}
Run Code Online (Sandbox Code Playgroud)

如果两个常量相同,if则省略并始终调用函数,如果它们不同,则省略整个块.

但是,在某些情况下,重要的是不要优化此代码,因为程序本身可以在运行之前进行修改.例如,二进制文件位于闪存中,可由外部程序访问,当然两者的地址const是固定的.(在嵌入式中有意义).

我正在考虑使用#pragma,但这不是C标准的一部分.

另一种方法是使用const volatile.这是否可以保证适用于所有符合标准的编译器?

Tim*_*nes 23

是的,const volatile int a = 3;完全符合您的要求,并且符合C89标准(参见C89第3.5.3节).

这个优秀的答案详细描述了const volatile在与您类似的情况下使用.


Nik*_*lis 6

const volatile应该做的伎俩,因为比较需要一两个"读" volatile变量-和标准保证了读取将具有可观察到的副作用进行治疗.

因此,他们不能只是被优化掉.

我必须问,你试图解决的问题需要这个解决方案吗?解释问题可能会让我们提供您可能没有考虑过的建议和解决方案,这些建议和解决方案不需要这种跳跃式跳跃.

  • 例如,嵌入式程序有一些设置.一个特殊的小"管理"程序可以修改这些设置.两个程序都在同一个eeprom中.为了轻松地处理设置,就像它们是变量一样,您可以将它们声明为常量并为它们分配固定地址(例如,在映射文件中).如果没有操作系统和`printf` /`scanf`,这是将设置存储到非易失性存储器的最简单方法. (2认同)