问题描述
根据 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
不能在编译时计算 - 所以它不能用作常量表达式
解决方法
常量表达式与 const
限定符没有任何关系。整数常量表达式的定义见6.6/6。
6.6/10 参考了同一章前面提到的整数常量表达式、初始化器中的常量表达式等部分。我相信引用的部分指的是各种极端情况,例如:
static int x;
static int y = (int)&x;
这并不严格,因为 &x
不被视为整数常量表达式,而是地址常量。 gcc 和 clang 都不接受它。我相信 6.6/10 允许编译器支持像上面例子那样的代码作为实现定义的扩展。
以@ryyker 评论中的 the link 为基础。
在 C 中,如果表达式完全由编译时常量(即文字)组成,则该表达式被认为是常量。不接受 const
变量,因为 const
不一定意味着“常量”;它只是意味着从当前编译单元的角度来看一个变量是不可变的(只读)。
考虑这样一个函数...
int add(const int a,const int b) {
return a + b;
您可以通过传入编译时常量来调用此函数,但也可以传入可变变量。如果您传入一个变量,就该范围而言,它被视为 const
(只读),但它的值在编译时仍然未知,因此它不是“常量”。