8

1994 年的混淆 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

稍加娇惯,您就可以绕过丢失的主要内容。

$ g++ -Wl,--defsym=_start=_exit -Wl,--undefined=_exit \
    -nostartfiles -static -o empty main_empty.cpp

更新:

注意到这main_empty.cpp是多余的。如果你从命令中删除它,它的编译结果是一样的。

我在其中添加了一些静态垃圾,main_empty.cpp以查看它是否以不同的行为表现出来,但事实并非如此。然而,它确实改变了可执行文件的大小。

#include <iostream>

struct Foo {
    Foo() {
        std::cout << "hi" << std::endl;
    }
} foo;

如果您将 a 添加main到文件中并正常编译,它将按照您对典型静态加载的预期输出。

4

1 回答 1

7

2012-11-02 的 C++ 草案。3.6.1:

一个程序应包含一个名为 main 的全局函数,它是程序的指定开始。独立环境中的程序是否需要定义主要功能是实现定义的。[注意:在独立环境中,启动和终止是实现定义的;启动包含执行具有静态存储持续时间的命名空间范围对象的构造函数;终止包含对具有静态存储持续时间的对象执行析构函数。——尾注]

于 2013-07-07T20:06:03.603 回答