【发布时间】:2020-03-22 17:01:14
【问题描述】:
据我所知,ISO C 标准对于 C11 中具有静态存储持续时间的对象的初始化程序是严格的 6.7.9 Initialization
具有静态或线程存储持续时间的对象的初始化程序中的所有表达式都应为常量表达式或字符串文字。
但是 GCC/Clang 都接受了以下代码:
const int i = 3; // const here should not make i a constant expression
static int j = i;
即使使用-Wall -Wextra -Werror -pedantic-errors,上面的编译器也没有给我任何抱怨。
但是,这些编译器确实意识到i 不是一个常量表达式。比如 Clang 给我的:
错误:静态数组的大小必须是整数常量表达式
以下代码:
const size_t sz = 3;
static int a[sz];
我这里有什么问题吗?
【问题讨论】:
-
编译器扩展
-
@Achel 因为标准并没有使其成为一体。如果您尝试使用
i作为static数组的大小,您的代码将被拒绝。 -
@klutt 我也是这么想的。但是如果需要常量表达式的其他场景涉及
i,这些编译器会抱怨。