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

时间:2013-04-23 07:10:47

标签: c

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

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

if (a == b)
{
    do_something();
}

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

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

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

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

2 个答案:

答案 0 :(得分:23)

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

This excellent answer详细介绍const volatile,用于与您类似的情况。

答案 1 :(得分:6)

const volatile应该这样做,因为比较需要“读取”两个volatile变量 - 并且标准保证读取将被视为具有可观察的副作用。

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

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