2013-07-07 5 views
7

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.

+0

Bis C++ 11, ich glaube, alles was es braucht, ist ein Newline. Das Hauptproblem hat nichts damit zu tun, es zu kompilieren. – chris

+0

'main_empty.cpp' in Ihrer letzten Zeile ist völlig redundant. –

+0

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

Antwort

7

C++ Entwurf vom 2012-11-02. 3.6.1:

Ein Programm muss eine globale Funktion namens main enthalten, die als Start des Programms bezeichnet wird. Es ist implementation-defined, ob ein Programm in einer freistehenden Umgebung erforderlich ist, um eine Hauptfunktion zu definieren. [Anmerkung: In einer freistehenden Umgebung sind Start und Beendigung durch die Implementierung definiert; start- up enthält die Ausführung von Konstruktoren für Objekte des Namensraumbereichs mit statischer Speicherdauer; Terminierung enthält die Ausführung von Destruktoren für Objekte mit statischer Speicherdauer. - Endnote]

+1

Es ist irgendwie interessant, wie kein Compiler das kompilieren kann, es wird nur nicht gelinkt. Es bringt dich auf halbem Weg dorthin. – chris

+6

@chris es sagt _program_ not _translation unit_. Der Linker ist Teil des Prozesses, der ein wohlgeformtes Programm generiert. – moooeeeep

+0

@moooeeeep, Guter Punkt :) – chris

Verwandte Themen