编译空文件是否遵循C++标准?

Tom*_*err 7 c++

1994年的Obfuscated C比赛中有一个参赛作品,是最小的quine.它只是一个空文件.

C++规范中是否有允许编译空文件的东西?如果没有,"有效程序"的最低要求是什么?我依稀记得在某处读到有一个特殊情况,其中一个空文件在C++规范中被赋予了默认实现,但我找不到引用.

我试过这个,虽然我不知道它一定有说服力.

$ rm main_empty.cpp
rm: cannot remove `main_empty.cpp': No such file or directory
$ touch main_empty.cpp
$ g++ -o empty main_empty.cpp
/usr/lib/gcc/.../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

有点溺爱,你可以绕过失踪的主要.

$ g++ -Wl,--defsym=_start=_exit -Wl,--undefined=_exit \
    -nostartfiles -static -o empty main_empty.cpp
Run Code Online (Sandbox Code Playgroud)

更新:

有人指出,这main_empty.cpp是多余的.如果从命令中删除它,它将编译相同的内容.

我添加了一些静态垃圾,main_empty.cpp以查看它是否表现在不同的行为,它没有.但确实改变了可执行文件的大小.

#include <iostream>

struct Foo {
    Foo() {
        std::cout << "hi" << std::endl;
    }
} foo;
Run Code Online (Sandbox Code Playgroud)

如果你添加一个main文件,并正常编译它将按照你所期望的典型静态加载输出.

Cyb*_*Guy 7

C++草案2012-11-02.3.6.1:

程序应包含一个名为main的全局函数,它是程序的指定开始.实现定义是否需要独立环境中的程序来定义主函数.[注意:在独立环境中,启动和终止是实现定义的; start-up包含具有静态存储持续时间的命名空间作用域对象的构造函数的执行; 终止包含具有静态存储持续时间的对象的析构函数的执行. - 结束说明]

  • @chris它说_program_不是_translation unit_.链接器是生成格式良好的程序的过程的一部分. (6认同)