为什么调用 main 函数被认为是未定义的行为 (UB)

2023-12-03

我担心这又是一个关于解释 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

  1. 调用 main 意味着程序包含违反 [basic.start.main] 规则的内容
  2. [basic.start.main] 未声明调用/使用是 UB 或不需要诊断
    1. 根据 [intro.compliance] 是“可诊断规则”的一个元素
  3. [intro.compliance] 2.2 规定违反任何可诊断规则必须发出至少一条诊断消息
  4. 由于 3. 和 4. main 的使用应发出至少一条诊断消息
  5. 由于 5.1. 不是 UB
  6. 由于 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(使用前将#替换为@)

为什么调用 main 函数被认为是未定义的行为 (UB) 的相关文章

  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 小数缓存是Python规范中定义的还是一个实现细节?

    Python 似乎有一个所谓的 小数字缓存 用于存储 5 到 256 范围内的数字 我们可以使用以下程序来演示这一点 for i in range 7 258 if id i id i 0 print i is cached else pr
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 私有模板函数

    我有一堂课 C h class C private template
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • 580001 无效请求:{0} PayPal (PHP)

    我从此页面发送用户名和密码 https www paypal com us cgi bin webscr cmd profile api signature AppId 是我在 Android 应用程序中用于创建付款的 ID https a
  • 如何让该 HTML 显示格式化且不带标签?

    我创建了一个博客 用于编码练习 我使用富文本编辑器 ckeditor 并将帖子保存到数据库中 当我将帖子拉出以显示在 Label Text 中时 它会显示所有 HTML 标签 p strong there was strong once a
  • 从代码运行 PsExec 进程的问题

    尝试使用 PsExec 远程运行 NET 命令行工具时 我遇到了一个奇怪的问题 从命令行运行 PsExec 时 它可以正常运行并完成 从控制台应用程序运行它时 创建进程 运行 PsExec exe 并为其提供必要的参数 它是 运行正常 当从
  • 如何从 statsmodels 中 WLS 回归的 2D 参数获取测试预测

    我正在逐步提高参数WLS 回归函数使用统计模型 我有一个 10x3 数据集 X 我声明如下 X np array 1 2 3 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 1 2 3 4 5 6 4 5 6 1 2 3 这是我
  • Azure 网站上的自定义域名正常工作,但总是重定向到 azurewebsites.net?

    我在共享模式 Azure 站点上设置了一个自定义域 其中 CNAME 为 www lakestarlodge com A 记录为 Lakestarlodge com 两者都有效 我可以在浏览器中输入其中之一并访问该网站 然而 我刚刚注意到
  • 单日历日期范围选择器

    我正在寻找构建一个日期范围选择器 其值一次仅包含一年的一月至十二月 它看起来像这样 这是从我现有的剑道日期范围选择器中获取的 并且经过了糟糕的Photoshop处理 我使用剑道日期选择器构建了一个日历 但它似乎需要两个日历 一个用于开始日期
  • 如何用 C# 创建自己的事件?

    如何用 C 创建自己的事件 以下是使用 C 创建和使用事件的示例 using System namespace Event Example First we have to define a delegate that acts as a
  • 查找可以用 1 和 0 书写的数字的倍数

    给定数字n 2 10 3 gt 111 4 gt 100 7 gt 1001 11 gt 11 9 gt 111 111 111 我的想法不太好 n 2 和 n 5 000 幻影的最大值 2 5 gt n 3 111 我认为 剩下的数字除法
  • 检查失败:mdb_status == 0 (2 vs. 0) 没有这样的文件或目录

    我在训练数据时收到以下错误 我已经尝试了互联网上给出的所有解决方案 但似乎没有一个对我有用 我已检查 lmdb 文件的路径和大小不为零 但问题仍然存在 我不知道如何解决这个问题 pooling I0411 12 42 53 114141 2
  • 根据窗口大小调整页面元素的大小

    Problem 我的客户希望我为他的产品创建一个启动网页 以便页面上不应该有滚动 任何浏览器或窗口尺寸 Doubt 使用 CSS 和 JavaScript 可以实现这一点吗 一些早期诊断 这可能有点类似于this or this但不同之处在
  • Xamarin.Auth Google 登录完成后不会自动关闭

    我跟随导游在此输入链接描述 当我登录我的谷歌帐户时遇到问题 它显示 toast 并且浏览器不会自动关闭以支持我的 Thanks 在您的 CustomUrlSchemeInterceptorActivity 页面中替换 OnCreate 内
  • 保存多帧 TIFF

    我从 C 应用程序中的 Stream 加载多帧 TIFF 然后使用 Image Save 方法保存它 但是 这仅保存第一帧的 TIFF 如何让它保存多帧 tiff 由于您没有提供任何详细信息 仅提供一些一般提示 多帧 TIFF 是非常复杂的
  • Bootstrap 导航栏宽度与容器相同

    我正在使用 Bootstrap 3 我不能让导航栏与容器具有相同的宽度 如果它适用于大屏幕但不适用于其他屏幕尺寸 我如何制作固定大小的导航栏 它将改变与容器宽度相同的不同屏幕 div class row div
  • 从 NSUserDefaults 字典 iOS 中删除所有键

    我使用 NSUserDefaults 字典来存储基本信息 例如高分等 以便当用户关闭应用程序时数据不会丢失 无论如何我使用 NSUserDefaults prefs NSUserDefaults standardUserDefaults 存
  • 如何使用 PYQt' QImage scanline() 访问像素数据

    我需要使用 PyQt4 访问 qimage 对象中的像素数据 pixel 太慢 因此文档说使用 scanline 方法 在 C 中 我可以获得 scanline 方法返回的指针 并从缓冲区读取 写入像素 RGB 值 使用Python 我得到
  • 如何在 CentOS 7 上安装最新版本的 Docker [已关闭]

    Closed 这个问题是与编程或软件开发无关 目前不接受答案 我正在尝试在 CentOS 7 64 位系统上安装现代 docker io 版本 1 5 yum 服务器附带的默认 docker io 是 1 3 2 并且 这个版本对于我需要的
  • 该文档没有页面。贾斯珀报告

    我在寻找此问题的解决方案时遇到问题 我的代码运行后工作正常 它假设将我的 sql 数据库上的数据显示到我的 jtable 中 并且有一个按钮将触发显示 jasper 报告 但有一点问题 它总是向我显示消息 文档没有页面 这是为什么 有人可以
  • 如何使用 adb shell 打开 Android 设备扬声器

    没有看到任何关于使用 adb shell 打开 Android 设备扬声器的命令 好奇是否有办法 call phone adb shell am start a android intent action CALL d tel X XXX
  • 如何使用 solana rust 合约发送 SOL

    我是一名 Rust Solana 开发新手 感觉我遇到的问题对大多数其他新手都有帮助 我想知道如何在指令期间将 SOL 从帐户转移到程序 然后能够将 SOL 发送回调用该指令的帐户 我读了https docs solana com 但我找不
  • 为什么调用 main 函数被认为是未定义的行为 (UB)

    我担心这又是一个关于解释 ISO IEC 14882 C 标准 的问题 但是 正在呼叫main从程序中 例如我的使命main 递归地从main至少不是实现定义的行为 更新 我的意思是稍后格式不正确 未定义实现 也不是 UB 请参见下文并回答