Why is calling the main function supposedly undefined behavior (UB)(为什么调用主函数被认为是未定义的行为(UB))
问题描述
恐怕这又是一个关于解释ISO/IEC 14882(C++标准)的问题,但是:
从程序调用main
,例如从main
递归调用main()
至少不是实现定义的行为吗?(更新:我暗示稍后未定义格式错误的未实现,也未定义UB,请参阅下文并回答)
6.9.3.1[basic.start.main]状态
consensus似乎是未定义的行为(UB)。documentation of MSVC还指向UB,one of gcc还隐式拒绝实现定义的行为。它不能是未指定的行为,因为我会将不应解释为格式错误。3函数Main不得在程序内使用。Main的链接(6.6)由实现定义...
然而,尽管有这些实现,我的解释是不应该是UB,而是正如4.1[Intro.Compliance]所述
1可诊断规则集由本文档中的所有语法和语义规则组成,但 包含"不需要诊断"的显式表示法或被描述为导致 "未定义的行为"。 ..。 (2.2)-如果程序包含对任何可诊断规则的违反或出现中描述的构造 当实现不支持该构造时,该文档被认为是"有条件支持的", 一致性实现应至少发出一条诊断消息。
对我来说,理由似乎很清楚
- 调用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说
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
作为扩展。该标准允许这样的扩展,因为它不会更改任何符合标准的程序的含义。
这篇关于为什么调用主函数被认为是未定义的行为(UB)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么调用主函数被认为是未定义的行为(UB)


基础教程推荐
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++,'if' 表达式中的变量声明 2021-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01