gpt4 book ai didi

静态变量可以用静态常量初始化吗?

转载 作者:行者123 更新时间:2023-12-03 13:32:46 26 4
gpt4 key购买 nike

this answer我基本需要static int n = -1;在一个函数里面。我想避免到处都是魔数(Magic Number),所以我改用了这个:

double f(int i)
{
static const int sentinel = -1;
static int n = sentinel;

if (n == sentinel)
// ...
}

然而有人指出这不符合标准,因为 sentinel不是(编译时)常量。

这对我来说很有意义,因为我知道常量整数在 C++ 中的编译时表达式(例如数组的大小)中可用。然而,gcc、clang 和 icc >v16 编译此代码时没有任何警告。只有 icc <=v16 和 MSVC 给出此警告/错误(参见 godbolt )。

C标准怎么说?这在不同版本的标准(c90、c99、c11)之间会发生变化吗?如果这不符合,我们可以在 gcc 和 clang 上得到警告吗?如果符合,为什么旧​​的 icc 和 MSVC 会出错?

最佳答案

static const int sentinel = -1; static int n = sentinel;符合 C 代码。它不是严格遵守 C 代码。

C 2018 将严格遵守的程序定义为“仅使用本文档中指定的语言和库的那些功能”(C 2018 4. 5)。严格遵守的程序是那些只使用标准中完全定义的核心语言的程序。它定义了一个符合要求的程序是一个“对于符合要求的实现是可以接受的”(4. 7)。对于托管实现,符合要求的实现是接受任何严格符合程序 (4. 6) 的实现,即支持核心 C 语言但也可能具有扩展的任何编译器或其他实现。

6.7.9 4 说“具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字。” sentinel显然不是字符串文字。它是一个常量表达式吗?常量表达式在 6.6 中定义。除了一个异常(exception),它们的操作数必须是整数常量(即诸如 37 之类的文字)、sizeof产生整数常量的表达式,_Alignof表达式、浮点常量、枚举常量、字符常量或一元 &具有一定约束条件的表达式。 sentinel这些都不是。

异常(exception)是第 10 段说“一个实现可以接受其他形式的常量表达式。”因此,如果 GCC 和其他编译器愿意,可以自由地接受此代码,因此,由于它被符合规范的实现所接受,因此它是符合规范的代码。但是,由于它是由实现定义的,无论是否接受,它都不是严格遵守的代码。

这与 1990 年以前的 C 标准基本相似,尽管有一些细微的变化,例如 _Alignof不在标准的早期版本中。

关于静态变量可以用静态常量初始化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61037093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com