我担心这又是一个关于解释 ISO/IEC 14882(C++ 标准)的问题,但是:
正在呼叫main
从程序中,例如我的使命main()
递归地从main
至少不是实现定义的行为? (更新:我的意思是稍后格式不正确,未定义实现,也不是 UB,请参见下文并回答)
6.9.3.1 [basic.start.main] 状态
3 程序中不得使用 main 函数。 main 的链接 (6.6) 是实现定义的......
The 共识似乎是未定义的行为(IN)。这MSVC 的文档还指向 UB,海湾合作委员会之一还隐式拒绝实现定义的行为。它不能是 [defns.unspecified] 未指定的行为,因为我会解释最好不要格式不正确。
然而,尽管有这些实现,根据我的解释,不应该是 UB,而是如 4.1 [intro.compliance] 所示
1 可诊断规则集包含本文档中除以下规则外的所有句法和语义规则:
包含“不需要诊断”或被描述为导致的明确符号的规则
“未定义的行为”。
...
(2.2) — 如果程序包含违反任何可诊断规则或出现中描述的构造
当实现不支持该构造时,本文档为“有条件支持”,
合格的实施应发出至少一条诊断消息。
对我来说,推理似乎很清楚
tl;dr
- 调用 main 意味着程序包含违反 [basic.start.main] 规则的内容
- [basic.start.main] 未声明调用/使用是 UB 或不需要诊断
-
- 根据 [intro.compliance] 是“可诊断规则”的一个元素
- [intro.compliance] 2.2 规定违反任何可诊断规则必须发出至少一条诊断消息
- 由于 3. 和 4. main 的使用应发出至少一条诊断消息
- 由于 5.1. 不是 UB
- 由于 gcc、MSVC 或 clang 都不会发出错误或警告但可以编译,因此所有主要实现都不兼容
当然,从7开始。我再次感受到唐吉诃德的场景,即错了,所以如果有人能启发我关于我的错误,我将不胜感激。否则,就有标准缺陷,不是吗?
我认为你的分析是正确的:调用main
格式不正确。
你必须通过-pedantic
标志以使 GCC 和 Clang 保持一致。在这种情况下,Clang 说
warning: ISO C++ does not allow 'main' to be used by a program [-Wmain]
海湾合作委员会说
warning: ISO C++ forbids taking address of function '::main' [-Wpedantic]
但他们允许致电main
作为扩展。该标准允许这样的扩展,因为它不会改变任何符合程序的含义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)