gpt4 book ai didi

c++ - 为什么调用主函数应该是未定义的行为 (UB)

转载 作者:行者123 更新时间:2023-12-04 13:07:50 26 4
gpt4 key购买 nike

我担心这又是一个关于解释 ISO/IEC 14882(C++ 标准)的问题,但是:

正在从程序中调用 main,例如我从 main 递归调用 main() 至少不是实现定义的行为? (更新:我的意思是稍后格式错误,未定义实现,也不是 UB,请参见下文并回答)

6.9.3.1 [basic.start.main] 状态

3 The function main shall not be used within a program. The linkage (6.6) of main is implementation-defined...

consensus似乎是未定义的行为(UB)。 documentation of MSVC也指向 UB,one of gcc也隐含地拒绝实现定义的行为。它不能是 [defns.unspecified] 未指定的行为,因为我会将 shall not 解释为格式错误。

然而,尽管有实现,但我的解释不应该是 UB,而是 4.1 [intro.compliance] 状态

1 The set of diagnosable rules consists of all syntactic and semantic rules in this document except for thoserules containing an explicit notation that “no diagnostic is required” or which are described as resulting in“undefined behavior”....(2.2) — If a program contains a violation of any diagnosable rule or an occurrence of a construct described inthis document as “conditionally-supported” when the implementation does not support that construct,a conforming implementation shall issue at least one diagnostic message.

对我来说推理似乎很清楚


tl;dr

  1. 调用 main 意味着程序违反了 [basic.start.main] 的规则
  2. [basic.start.main] 没有声明调用/使用是 UB 或不需要诊断
  3. >
    1. 根据 [intro.compliance] 是“可诊断规则”的一个元素
  4. [intro.compliance] 2.2 声明违反任何可诊断规则必须至少发出一条诊断消息
  5. 从 3. 和 4. 开始,main 的使用应至少发出一条诊断消息
  6. 因为 5. 1. 不是 UB
  7. 由于 gcc、MSVC 或 clang 都不会发出错误或警告但会编译,因此所有主要实现都不兼容

当然是从 7 开始的。我又一次在堂吉诃德的场景中感到自己错了,所以如果有人能告诉我我的错误,我将不胜感激。否则,存在标准缺陷,不是吗?

最佳答案

我认为您的分析是正确的:对 main 的调用格式不正确。

您必须传递 -pedantic 标志以使 GCC 和 Clang 符合。在那种情况下,Clang 说

warning: ISO C++ does not allow 'main' to be used by a program [-Wmain]

GCC 说

warning: ISO C++ forbids taking address of function '::main' [-Wpedantic]

但它们允许调用 main 作为扩展。该标准允许这样的扩展,因为它不会改变任何符合标准的程序的含义。

关于c++ - 为什么调用主函数应该是未定义的行为 (UB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68564133/

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