【发布时间】: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;作为有效的常量表达式。