为什么将 main 声明为数组会编译?

2024-01-03

I saw CodeGolf 上的一段代码 https://codegolf.stackexchange.com/a/69193/13441这是一个编译器炸弹,其中main被声明为一个巨大的数组。我尝试了以下(非炸弹)版本:

int main[1] = { 0 };

它似乎在 Clang 下编译得很好,在 GCC 下只有一个警告:

警告:“main”通常是一个函数 [-Wmain]

当然,生成的二进制文件是垃圾。

但为什么它能编译呢? C 规范是否允许这样做?我认为相关的部分说:

5.1.2.2.1 程序启动

程序启动时调用的函数名为 main。该实现没有声明该函数的原型。它应使用 int 返回类型进行定义,并且不带参数 [...] 或带两个参数 [...] 或以某种其他实现定义的方式定义。

“其他一些实现定义的方式”是否包括全局数组? (在我看来,该规范仍然指的是function.)

如果不是,它是编译器扩展吗?或者工具链的一个功能,用于其他目的,并且他们决定通过前端提供它?


这是因为 C 允许“非托管”或独立环境,不需要main功能。这意味着这个名字main被释放用于其他用途。这就是为什么语言本身允许这样的声明。大多数编译器都被设计为支持两者(区别主要在于链接的完成方式),因此它们不会禁止在托管环境中非法的构造。

您在标准中引用的部分是指托管环境,独立式的对应部分是:

在独立环境中(其中 C 程序执行可以在没有任何 操作系统的好处),程序中调用的函数的名称和类型 启动是实现定义的。任何可供独立使用的图书馆设施 除了第 4 条要求的最小集合之外,程序都是实现定义的。

如果您像往常一样链接它,它将变得很糟糕,因为链接器通常对符号的性质知之甚少(它具有什么类型,甚至它是一个函数或变量)。在这种情况下,链接器将愉快地解析对main到名为的变量main。如果未找到该符号,将导致链接错误。

如果您像往常一样链接它,您基本上是在尝试在托管操作中使用编译器,然后不定义main正如您所期望的那样,按照附录 J.2 意味着未定义的行为:

在以下情况下,该行为是未定义的:

  • ...
  • 托管环境中的程序未定义名为的函数 主要的 使用一个 指明表格(5.1.2.2.1)

独立可能性的目的是能够在未给出标准库或 CRT 初始化的环境中使用 C。这意味着之前运行的代码main被调用(即初始化 C 运行时的 CRT 初始化)可能不会提供,并且您需要自己提供(并且您可能决定拥有一个main或者可能决定不这样做)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么将 main 声明为数组会编译? 的相关文章

  • 地图类容器的专用功能

    我想要专门为矢量和地图之类的容器设计一个函数模板 对于向量 我可以像下面那样做 但我不知道如何才能有一个专门版本的函数 该函数仅用于像地图这样的容器 include
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 没有配置身份验证处理程序来处理该方案

    这是一个非常烦人的问题 我在我的 asp net core 项目上设置 cookie 身份验证 有时会出现此错误 有时不会 没有图案 它只是开始抛出错误 然后突然停止 然后再次开始 例外情况是 InvalidOperationExcepti
  • 使用 C 的另一个结构内的灵活长度结构数组

    你好 我正在尝试使用 C 来实现一个简单的结构 2 个盒子 每个盒子包含不同数量的颗粒 main 中传递的粒子的确切数量 我写了以下代码 typedef struct Particle float x float y float vx fl
  • 如何配置 Ninject 来注入 NodaTime IClock

    在我的 NinjectConfigurator 中我有 container Bind
  • 如何在建立上下文时设置连接超时-PrincipalContext

    using PrincipalContext ctx new PrincipalContext ContextType Domain Domain UserName Password UserPrincipal U new UserPrin
  • 图片框、双击和单击事件

    我有一个奇怪的问题 我有一个图片框双击事件以及单击事件 问题是即使我双击该控件 也会引发单击事件 如果我禁用单击事件 则双击事件正在工作 这个问题已经在这里讨论过 https stackoverflow com questions 1830
  • 如何在单例类和未命名类之间进行选择?

    我会使用这样的单例 Singleton single Singleton instance single gt do it 我会使用这样的未命名类 single do it 我觉得单例模式除了具有可读的错误消息之外 与未命名的类相比没有任何
  • MVC BaseController 处理 CRUD 操作

    我想重构我的基本 CRUD 操作 因为它们非常重复 但我不确定最好的方法 我的所有控制器都继承 BaseController 如下所示 public class BaseController
  • 如何查看每秒更新的图表中的最后 10 个数据点?

    我有这个代码 private void timer Tick object sender EventArgs e timer Stop for int i 0 i lt TOTAL SENSORS i DateTime d DateTime
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • 对象变空似乎是 Hangfire 中的反序列化问题

    Hangfire 似乎无法反序列化我的原始版本Scheduler对象及其所有状态 我正在调用其 Execute 方法BackgroundJob Enqueue 如下所示 Scheduler new FileInFileOut FileIn
  • 向客户端发送状态码 500 时页面未呈现

    我有一个页面 通用处理程序 我想在该页面上向客户端返回状态代码 500 以指示出现问题 我这样做 Response StatusCode 500 Response StatusDescription Internal Server Erro
  • Qt - 添加超链接到对话框

    有没有办法在 Qt 对话框中添加可点击的超链接 IE 它应该看起来像一个超链接 蓝色文本 当您单击它时 它应该在浏览器中打开该超链接 像这样的东西 Use QLabel setOpenExternalLinks bool 并在标签上设置文本
  • asio::this_coro::executor 的实现是什么

    在协程函数中 我们可以添加auto ex co await asio this coro executor 获取该协程的执行者 但当我想了解它的定义时 我发现了这个 Awaitable type that returns the execu
  • 使用属性和性能

    我正在优化我的代码 我注意到使用属性 甚至自动属性 对执行时间有深远的影响 请参阅下面的示例 Test public void GetterVsField PropertyTest propertyTest new PropertyTest
  • 在for循环中声明和初始化变量

    可以简单写一下吗 for int i 0 代替 int i for i 0 在 C 或 C 中 并且会变量i只能在循环内部访问 它在 C 中有效 它在 C 的原始版本中是不合法的 但在 C99 中被采用为 C 的一部分 当时一些 C 功能被
  • 如何正确处置注入的DLL线程?

    我将一个 DLL 注入到目标进程中 以在玩 MMORPG 时充当助手 当前功能将按键转换为鼠标点击 因为 MMORPG 要求用户移动鼠标才能实现某些功能 这是我所鄙视的 假设我出于某种原因想要取消注入 DLL 我该怎么做呢 这个方法干净吗
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web
  • 获取线段上最接近另一个点的点[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想找到线段AB上最接近另一个点P的点 我的想法是 Get a1 and b1由直线公式y1 a1x b1 使用 A 点

随机推荐