Ist das unter dem kürzlich aktualisierten Standard gültig?
%Vor% Meine beste Vermutung ist, dass es darauf ankommt, ob main () eine Funktion sein muss oder ob es ein beliebiges globales Bereichs-Symbol sein darf, das aufrufbar ist (mit ()
).
Nein, und hier ist warum:
[n3290: 3.6.1/1]:
Ein Programm soll eine globale Funktion namens. enthalten main , was der vorgesehene Start des Programms ist. Es ist Implementierung definiert, ob ein Programm in einer freistehenden Umgebung wird benötigt, um eine Hauptfunktion zu definieren. [ Hinweis: In einem freistehenden Umgebung, Start und Beendigung ist implementierungsdefiniert; startup enthält die Ausführung von Konstruktoren für Objekte von Namensraumbereich mit statischer Speicherdauer; Kündigung enthält die Ausführung von Destruktoren für Objekte mit statischer Speicherdauer. -Endnote ]
Lambdas sind keine Funktionen, sondern Funktionsobjekte oder Funktoren:
[n3290: 5.1.2/3]:
Der Typ des Lambda-Ausdrucks (was ist auch der Typ des Closure-Objekts) ist eine eindeutige, unbenannte Nicht-Union Klassentyp - der Verschlusstyp genannt - dessen Eigenschaften im Folgenden beschrieben werden. [..]
Nein, main
muss eine globale Funktion sein und kann kein Funktionsobjekt oder irgendetwas anderes sein. Siehe ISO / IEC 14882: 2011 § 3.6.1 Hauptfunktion.
Ein Programm soll eine globale Funktion namens main enthalten, die den vorgesehenen Start des Programms darstellt.
Und aus Absatz 2
Alle Implementierungen müssen beide der folgenden Definitionen von Hauptsache:
int main() { /* ... */ }
und
int main(int argc, char* argv[]) { /* ... */ }
Es ist nicht erforderlich, dass Implementierungen andere Definitionen zulassen.
main () muss eine Funktion sein, weil es von innen mit den Systembibliotheken aufgerufen wird. Es ist Teil des POSIX.1-Standards und regelt die Funktionsweise von C-Verknüpfungen.
Die Hauptverknüpfung muss extern global sein, sie kann nicht inlined oder statisch sein, da sie aus der libc aufgerufen wird und typischerweise von einer Funktion namens _start stammt.
Als Beispiel ist eine typische Implementierung von _start in glibc:
%Vor%Verschiedene libc-Implementierungen werden es auf ähnliche Weise tun.
In C ++ muss die Hauptfunktion im globalen Geltungsbereich deklariert sein (d. h.) :: main (); wieder, weil es von einer init-like Funktion wie _start für libc on * nix-Funktion oben nach der Ausführung aufgerufen wird ...