在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
到文件中并正常编译,它将按照您对典型静态加载的预期输出。