Kann die Hauptfunktion (oder Einstiegspunktfunktion) als Lambda implementiert werden?

8

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 () ).

    
Michael Price 21.10.2011, 15:07
quelle

3 Antworten

7

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. [..]

    
Lightness Races in Orbit 21.10.2011, 15:19
quelle
14

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.

    
bames53 21.10.2011 15:14
quelle
1

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 ...

    
Ahmed Masud 21.10.2011 15:24
quelle

Tags und Links