【问题标题】:Making sure a value only has to be calculated once ever in C确保一个值只需要在 C 中计算一次
【发布时间】:2021-11-23 03:46:30
【问题描述】:

我有这个有点复杂的值(因为它是通过以某种数学上不平凡的方式组合多个其他值产生的),但是在整个程序执行中只需要计算一次。我试着把它们都做成static const。

但是编译器抱怨我对复杂值的输入必须“具有恒定值” - 他们显然在编译时会这样做。

在这个例子中,我想一劳永逸地从a 和b 计算c。但是编译器抱怨说,在c、a 和b 的赋值中必须“具有恒定值”——它们显然是这样做的(在我看来)。

void foo(void)
{
    static const int a = 10, b = 2;
    static const int c = a/b;
}

【问题讨论】:

  • 我们可能需要更多上下文,但只是static int c = a/b;(例如)意味着初始化只执行一次......如果这是在函数内部,那么它将首先完成输入该函数的时间。
  • 在godbolt上工作得很好?
  • @Mgetz 编译器可能会选择“扩展”他们对编译时常量的理解。
  • @Mgetz 我认为 C 标准对“常量表达式”的定义不是很明确。唯一明确的要求是它可以在翻译时进行评估:Constant Expressions 此外,根据6.6p10,它说“一个实现可以接受其他形式的常量表达式。”,还有6.6 note 118将static int i = 2 || 1 / 0; 作为有效的常量表达式。

标签: c c89


【解决方案1】:

声明为const 的变量在C 中不被视为常量,因此表达式a/b 不被视为常量。

处理这个问题的最简单方法是在程序启动时分配main 中的值,尽管这意味着全局不能是const。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2019-08-10
    • 2021-01-20
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    相关资源
    最近更新 更多