【问题标题】:Shortest Program in c++c++中最短的程序
【发布时间】:2010-12-28 20:21:51
【问题描述】:

我最近遇到了这段代码,它可以编译,但运行时出现分段错误(g++)。 这是来自 topcoder 的原始链接 topcoder profile

#include <iostream>
int main = ( std::cout << "Hello world!\n", 42  );

这也编译

int main=0;

谁能解释一下这个程序发生了什么。使用 g++

【问题讨论】:

  • 你认为最短的是什么?最短的 C++ 程序长度为 0 个字符。那是两个不同的程序吗?还是同一程序的 2 个部分?
  • 这里有太多错误,我什至不知道从哪里开始。
  • 这些都不是有效的程序。如果您的实现碰巧生成了一个可执行文件或允许其中任何一个运行,这是实现的不幸结果(以及您使用的语言本质上无法检查所有可能的错误条件的事实)。
  • 我知道应该没有不好的问题,但这真的没用。
  • @John Dibling:我刚刚发布了这个问题,因为它来自排名第 121 位的 topcoder 成员

标签: c++


【解决方案1】:

这都是愚蠢的游戏。这两个程序都违反了“程序应包含名为main 的全局函数”(3.6.1p1)的要求。这些程序可能会欺骗一些编译器,因为它们定义了一个符号main,但这个符号根本不是一个函数!难怪当运行时尝试将 main 符号用作函数时,其中至少有一个会崩溃。

托管实现中最短的有效 C++03 程序:

int main(){}

【讨论】:

  • 它不会导致未定义的行为,main 可能不返回任何内容,在这种情况下返回零。
  • 如果缺少一个return 0;,编译器不会添加吗?或者在这些方面做些什么?
  • 请注意,此自动 return 0 仅适用于 main。忘记了这个异常(实际上不应该使用)。感谢您的更正。
  • 为什么不应该使用它?它具有明确的行为;我自己看不到劣势。
【解决方案2】:

抱歉,您发布的代码不是有效的 C++ 程序。有效的 C++ 程序必须有一个入口点,该入口点是全局范围内名称为 main 的函数,具有标准规定的签名之一。 C++ 中最短的有效程序是:

int main(){}

【讨论】:

  • 不要忘记换行符。 :-)
  • 根据第 16 节中描述的预处理语法,记号必须后跟换行符,否则翻译单元在语法上无效。当然,大多数编译器无论如何都会接受没有最终换行符的文件。
  • @Billy: 2.1/1: "如果一个非空的源文件不以换行符结尾,或者以紧跟反斜杠字符的换行符结尾,则行为未定义”。所以取决于你是想要一个有效的程序,还是一个具有定义行为的有效程序。
  • @Steve @aschepler:Bill 跑了起来,开始在他的代码库中寻找那个......
  • @R.. @Billy ONeal 在旧版/当前版本的 C/C++ 中,从技术上讲,您需要换行符(尽管大多数编译器不会抱怨)但是在 C++ 中0x 此限制已被移除。
【解决方案3】:

以下代码将起作用:

char main[]="\xb4\x00\xcd\x16\xcd\x20";

这会将以下的机器级代码分配给符号main,它是一个char数组。

mov ah,0
int 16h ; Wait for a keyboard input i.e getch();
int 20h ;  Exit to DOS

编译器看到一个符号 main 并正确编译代码。它将控制权传递给符号 main(这是 C/C++ 编译器的默认操作),在那里它可以找到机器代码。因此,它可以正常执行。

【讨论】:

    【解决方案4】:

    如果您真的对可执行文件的大小感兴趣,那么代码行数真的不重要,至少对我来说不重要。重要的是机器指令和文件的大小。这里有两个非常棒的链接:

    • A Whirlwind Tutorial 谈如何为 Linux 创建非常小的 ELF 可执行文件。
    • Tiny PE(Portable Executable,win32 和 x64 可执行文件格式)。

    简而言之,最小的可执行文件不一定取决于代码行数,但除此之外还有许多其他因素。在我看来,这是一个非常有趣的工程。

    【讨论】:

    • @Muggen 谢谢...我认为 ELF 可能有点过时了;在 linux 完全拒绝之前,我无法达到他们的水平。 x64 的情况可能已经改变。如果我今年有任何空闲时间没有考试、工作、投标或任何我自己要去尝试的事情......!
    • 虽然这些链接很有趣,但我认为从 372 字节变为 45 字节的步骤几乎没有实际意义,而减少看似微不足道但有用程序的步骤50k 到 5k 的磁盘或从 500k 到 24k 的驻留大小更有趣。
    • @R 我不同意你的观点。我只是出于兴趣而发布它们。
    【解决方案5】:

    最小的c++程序是:

    int main(){}

    输出:https://i.stack.imgur.com/X6xiK.png

    【讨论】:

      猜你喜欢
      • 2021-03-18
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多