首页 > 解决方案 > C 常量表达式。const 变量作为常量表达式

问题描述

根据 6.6.10

10 一个实现可以接受其他形式的常量表达式。

实现可能会考虑const(或者甚至不const作为答案关注它 - 但它不是问题的核心)变量作为常量表达式。

我的逻辑正确吗?如果不是为什么?

一些例子:

//file scope

int a = 5;
const int b = 10;

int c[a];
int d[b];

IMO 均符合要求。它们可以评估编译时间。该值是已知的,并且静态数组的大小已知编译时间。

volatile int x = 5;  //cannot be considered as known compile time. ????
void foo(int a)
{
    static int b[a];
}

在这个例子a中不能评估编译时间 - 所以它不能用作常量表达式

标签: cconstantslanguage-lawyerconstant-expression

解决方案


const常量表达式与限定符没有任何关系。整数常量表达式的定义见 6.6/6。

6.6/10 参考同一章的前面部分,谈到整数常量表达式、初始化器中的常量表达式等。我相信引用的部分是指各种极端情况表达式,例如:

static int x;
static int y = (int)&x;

这不是严格符合的,因为&x它不被视为整数常量表达式,而是地址常量。gcc 和 clang 都不接受它。我相信 6.6/10 允许编译器支持像上面示例这样的代码作为实现定义的扩展。


推荐阅读