gpt4 book ai didi

c - 为什么在 gcc 上接受 const 限定变量作为初始值设定项?

转载 作者:行者123 更新时间:2023-12-04 11:48:19 25 4
gpt4 key购买 nike

使用 -std=c17 -pedantic-errors -Wall -Wextra 在最新版本的 gcc(或 clang)中编译此代码时

static const int y = 1;
static int x = y;
然后我没有收到编译器诊断消息,即使我相当确定这不是有效的 C 而是约束违规。我们可以通过查看C17 6.7.9/4来证明它是不符合的:

Constraints
...
All the expressions in an initializer for an object that has static or thread storage duration shall be constant expressions or string literals.


然后是关于常量表达式的定义,在这种情况下是整数常量表达式(6.6):

An integer constant expression shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof expressions whose results are integer constants, _Alignof expressions, and floating constants that are the immediate operands of casts.


最后是关于整数常量的定义(6.4.4.1/2):

An integer constant begins with a digit, but has no period or exponent part. It may have a prefix that specifies its base and a suffix that specifies its type.


因此一个 const int variable 不是整数常量,也不是整数常量表达式。因此不是有效的初始化程序。这之前已经讨论过(例如 here ),我认为已经确定这是不合格的。但是,我的问题是:
为什么 gcc 即使在严格模式下也选择不合规?
clang 显然一直不合规,但 gcc 从 7.3 版的合规变为 8.0 及更高版本的不合规。即使在没有 -pedantic-errors 的默认模式下,gcc 7.3 及更早版本也会给出“错误:初始化元素不是常量” .
似乎已经对这条消息做出了某种主动的、有意识的决定。为什么它在 gcc 中被完全删除,为什么在严格模式下编译时他们没有保持原样 -std=c17 -pedantic-errors ?

最佳答案

Why did gcc chose to be non-compliant even in strict mode?


由于所提出的问题是针对开发人员的动机,我们作为第三方必须继续提供的唯一信息来自公共(public)开发工件,例如 GCC bugzilla、存储库提交消息和实际代码。正如评论中所指出的,此事在 the Bugzilla comment thread associated with the change 中讨论。 .
Bugzilla 的讨论似乎表明开发人员考虑了该领域的标准要求,尽管有些敷衍。具体见评论 910 .他们提出了语言规范的第 6.6/10 段:

An implementation may accept other forms of constant expressions.


他们没有对此进行任何特别的审查,我阅读这些评论更多是为了寻求改变的理由,而不是对 GCC 一致性考虑的深思熟虑。
因此,他们做出更改是因为他们想要实现功能请求,并且他们在标准语言中找到了足够的(对他们来说)理由来考虑改变的行为与语言约束一致,因此不需要诊断。

还有一个隐含的问题,即最近 GCC 对提交的声明表的沉默接受是否实际上违反了符合规范的处理器诊断约束违规的义务。
尽管可以将 6.6/10 解释为允许实现接受他们选择的任何表达式,以符合任何类型的常量表达式的要求,但这似乎令人担忧。一段给定的代码是否满足语言的约束不应该依赖于实现。如果接受这些解释点中的任何一个,都可以解决该问题:
  • 6.6/10 应该被解释为表达了一个通用规则的特定情况,即一个符合的实现可以接受不符合的代码,而不意味着这样做使处理器有权将代码视为符合的。
  • 6.6/10 应该被解释为允许处理器将更多的表达式解释为“常量表达式”而不是前面段落中描述的那些,但这与这些段落中定义的特定类型的常量表达式的定义无关(“整数常量表达式”和“算术常数表达式”)。

  • 这些并不相互排斥。我订阅后者, as I have written previously ,我也倾向于前者。

    关于c - 为什么在 gcc 上接受 const 限定变量作为初始值设定项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68252570/

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