Es gab einen Eintrag in der 1994 Obfuscated C contest, die als die kleinste Quine qualifiziert. Es war nur eine leere Datei.Befolgt das Kompilieren einer leeren Datei den C++ - Standard?
Gibt es in der C++ - Spezifikation etwas, das das Kompilieren leerer Dateien ermöglicht? Wenn nicht, was ist das absolute Minimum für ein "gültiges Programm"? Ich erinnere mich vage daran, irgendwo gelesen zu haben, dass es einen speziellen Fall gab, in dem eine leere Datei eine Standardimplementierung in der C++ - Spezifikation erhielt, aber ich konnte die Referenz nicht finden.
Ich habe das versucht, obwohl ich nicht weiß, dass es unbedingt überzeugend ist.
$ 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
Mit ein wenig Verhätscheln können Sie sich um die fehlende Hauptleitung kümmern.
$ g++ -Wl,--defsym=_start=_exit -Wl,--undefined=_exit \
-nostartfiles -static -o empty main_empty.cpp
UPDATE:
Es wurde festgestellt, dass die main_empty.cpp
überflüssig war. Wenn Sie es aus dem Befehl entfernen, wird dasselbe kompiliert.
Ich fügte der main_empty.cpp
etwas statischen Müll hinzu, um zu sehen, ob es sich in unterschiedlichem Verhalten manifestierte, und es tat es nicht. Es hat jedoch die Größe der ausführbaren Datei geändert.
#include <iostream>
struct Foo {
Foo() {
std::cout << "hi" << std::endl;
}
} foo;
Wenn Sie ein main
zur Datei hinzufügen und kompilieren als normal, es wird ausgegeben, wie Sie mit typischer statischer Belastung erwarten würden.
Bis C++ 11, ich glaube, alles was es braucht, ist ein Newline. Das Hauptproblem hat nichts damit zu tun, es zu kompilieren. – chris
'main_empty.cpp' in Ihrer letzten Zeile ist völlig redundant. –
Wenn Sie sich die Toolchain anschauen, die die ausführbare Datei erzeugt, werden Sie bemerken, dass 'cp smr.c smr' und' chmod + x smr' anstelle eines tatsächlichen C-Compilers angewendet werden. – moooeeeep