c ++中最短的程序

ame*_*een -9 c++

我最近遇到了这个编译的代码,但运行了分段错误(g ++).这是topcoder topcoder配置文件的原始链接

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

这也编译

int main=0;
Run Code Online (Sandbox Code Playgroud)

有人可以解释这个程序中发生了什么.使用g ++

ybu*_*ill 15

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

int main(){}
Run Code Online (Sandbox Code Playgroud)

  • 根据第16节中描述的预处理语法,令牌必须后跟换行符,否则翻译单元在语法上无效.当然,大多数编译器都会接受没有最终换行的文件. (4认同)
  • @Steve @aschepler:*Bill运行并开始查看他的代码库....* (3认同)
  • @R .. @Billy ONeal在旧的/当前版本的C/C++中,技术上你需要换行符(尽管大多数编译器不会抱怨)**但是**在C++ 0x中这个限制已被删除. (2认同)

asc*_*ler 15

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

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

int main(){}
Run Code Online (Sandbox Code Playgroud)

  • 它不会导致未定义的行为,main可能不返回任何内容,在这种情况下返回零. (3认同)
  • 为什么不应该使用它?它具有明确定义的行为;我自己看不出缺点。 (2认同)

小智 6

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

  • 关于为Linux创建真正的Teensy ELF可执行文件的旋风教程.
  • Tiny PE(可移植可执行文件,win32和x64可执行文件格式).

简而言之,可能的最小可执行文件不一定取决于代码行的数量,还有许多其他的东西.在我看来,这是一些非常有趣的工程.


小智 6

以下代码将起作用:

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

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

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

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