Ist 'int main;' ein gültiges C / C ++ - Programm?

113

Ich frage, weil mein Compiler das zu glauben scheint, obwohl ich es nicht tue.

echo 'int main;' | cc -x c - -Wall
echo 'int main;' | c++ -x c++ - -Wall

Clang gibt dabei keine Warnung oder Fehler aus, und gcc gibt nur die sanfte Warnung aus 'main' is usually a function [-Wmain]:, aber nur, wenn es als C kompiliert wurde. Die Angabe von a -std=scheint keine Rolle zu spielen.

Andernfalls wird es gut kompiliert und verknüpft. Aber bei der Ausführung endet es sofort mit SIGBUS(für mich).

Lesen Sie die (ausgezeichneten) Antworten unter Was sollte main () in C und C ++ zurückgeben? und eine schnelle grep durch die Sprachdaten, wäre es sicher scheint mir , dass eine Hauptfunktion erforderlich ist. Aber die Aussprache von gcc's -Wmain('main' ist normalerweise eine Funktion) (und der Mangel an Fehlern hier) scheint möglicherweise etwas anderes zu suggerieren.

Aber wieso? Gibt es dafür einen seltsamen Randfall oder eine „historische“ Verwendung? Weiß jemand was gibt?

Mein Punkt ist wohl, dass ich wirklich denke, dass dies ein Fehler in einer gehosteten Umgebung sein sollte, oder?

Geoff Nixon
quelle
6
Um gcc zu einem (meistens) standardkonformen Compiler zu machen, benötigen Siegcc -std=c99 -pedantic ...
pmg
3
@pmg Es ist die gleiche Warnung, mit oder ohne -pedanticoder keine -std. Mein System c99kompiliert dies auch ohne Warnung oder Fehler ...
Geoff Nixon
3
Wenn Sie "klug genug" sind, können Sie leider Dinge erstellen, die vom Compiler akzeptiert werden, aber keinen Sinn ergeben. In diesem Fall verknüpfen Sie die C-Laufzeitbibliothek, um eine aufgerufene Variable aufzurufen main, die wahrscheinlich nicht funktioniert. Wenn Sie main mit dem "richtigen" Wert initialisieren, wird es möglicherweise tatsächlich zurückgegeben ...
Mats Petersson
7
Und selbst wenn es gültig ist, ist es eine schreckliche Sache (unlesbarer Code). Übrigens kann es bei gehosteten Implementierungen und bei freistehenden Implementierungen (die nichts davon wissen main)
anders sein
1
Versuchen main=195;
Sie

Antworten:

97

Da die Frage doppelt als C und C ++ gekennzeichnet ist, wäre die Begründung für C ++ und C unterschiedlich:

  • C ++ verwendet die Namensverknüpfung, um Linkern die Unterscheidung zwischen textuell identischen Symbolen unterschiedlichen Typs zu erleichtern, z. B. einer globalen Variablen xyzund einer freistehenden globalen Funktion xyz(int). Der Name mainwird jedoch nie entstellt.
  • C verwendet kein Mangeln, daher kann ein Programm den Linker verwirren, indem es anstelle eines anderen Symbols ein Symbol einer Art bereitstellt und das Programm erfolgreich verknüpft.

Das ist es, was hier vor sich geht: Der Linker erwartet, ein Symbol zu finden main, und das tut er auch. Es "verdrahtet" dieses Symbol, als wäre es eine Funktion, weil es es nicht besser weiß. Der Teil der Laufzeitbibliothek, der die Steuerung an den mainLinker abfragt main, der Linker gibt ihm ein Symbol main, damit die Linkphase abgeschlossen werden kann. Dies schlägt natürlich zur Laufzeit fehl, da dies mainkeine Funktion ist.

Hier ist ein weiteres Beispiel für dasselbe Problem:

Datei xc:

#include <stdio.h>
int foo(); // <<== main() expects this
int main(){
    printf("%p\n", (void*)&foo);
    return 0;
}

Datei yc:

int foo; // <<== external definition supplies a symbol of a wrong kind

Kompilieren:

gcc x.c y.c

Dies wird kompiliert und wahrscheinlich ausgeführt, aber es ist ein undefiniertes Verhalten, da sich der Typ des dem Compiler versprochenen Symbols von dem tatsächlichen Symbol unterscheidet, das dem Linker bereitgestellt wird.

Was die Warnung betrifft, halte ich es für vernünftig: Mit C können Sie Bibliotheken erstellen, die keine mainFunktion haben, sodass der Compiler den Namen mainfür andere Zwecke freigibt, wenn Sie mainaus einem unbekannten Grund eine Variable definieren müssen .

dasblinkenlight
quelle
3
Der C ++ - Compiler behandelt die Hauptfunktion jedoch anders. Sein Name wird auch ohne externes "C" nicht entstellt. Ich denke, das liegt daran, dass es sonst ein eigenes externes "C" -Mintern ausgeben müsste, um die Verknüpfung sicherzustellen.
UldisK
@UldisK Ja, das habe ich selbst bemerkt und fand es ziemlich interessant. Es macht Sinn, aber darüber hatte ich nie nachgedacht.
Geoff Nixon
2
Tatsächlich unterscheiden sich die Ergebnisse für C ++ und C nicht , wie hier ausgeführt - mainsie unterliegen in C ++ keiner Namensverfälschung (so scheint es), unabhängig davon, ob es sich um eine Funktion handelt oder nicht.
Geoff Nixon
4
@nm Ich denke, dass Ihre Interpretation der Frage zu eng ist: Zusätzlich zur Frage im Titel des Beitrags sucht OP eindeutig nach einer Erklärung, warum sein Programm überhaupt kompiliert wurde ("mein Compiler scheint das zu glauben, obwohl ich es nicht tue ") sowie einen Vorschlag, warum es nützlich sein könnte, mainetwas anderes als eine Funktion zu definieren . Die Antwort bietet eine Erklärung für beide Teile.
Dasblinkenlight
1
Dass das Symbol main nicht dem Namen Mangling unterliegt, spielt keine Rolle. Im C ++ - Standard wird das Mangeln von Namen nicht erwähnt. Das Mangeln von Namen ist ein Implementierungsproblem.
David Hammen
30

mainist kein reserviertes Wort , es ist nur eine vordefinierte Kennung (wie cin, endl, npos...), so dass Sie rief eine Variable deklarieren könnte main, es zu initialisieren und dann seinen Wert auszudrucken.

Natürlich:

  • Die Warnung ist nützlich, da dies sehr fehleranfällig ist.
  • Sie können eine Quelldatei ohne die main()Funktion (Bibliotheken) haben.

BEARBEITEN

Einige Referenzen:

  • main ist kein reserviertes Wort (C ++ 11):

    Die Funktion maindarf nicht innerhalb eines Programms verwendet werden. Die Verknüpfung (3.5) von mainist implementierungsdefiniert. Ein Programm , das Haupt definiert als gelöscht oder daß erklärt Haupt sein inline, staticoder constexprwird schlecht gebildet. Der Name mainist nicht anderweitig reserviert. [Beispiel: Elementfunktionen, Klassen und Aufzählungen können aufgerufen werden main, ebenso wie Entitäten in anderen Namespaces. - Beispiel beenden]

    C ++ 11 - [basic.start.main] 3.6.1.3

    [2.11 / 3] [...] Einige Bezeichner sind für die Verwendung durch C ++ - Implementierungen und Standardbibliotheken (17.6.4.3.2) reserviert und dürfen nicht anderweitig verwendet werden. Es ist keine Diagnose erforderlich.

    [17.6.4.3.2 / 1] Bestimmte Sätze von Namen und Funktionssignaturen sind immer der Implementierung vorbehalten:

    • Jeder Name, der einen doppelten Unterstrich __ enthält oder mit einem Unterstrich gefolgt von einem Großbuchstaben (2.12) beginnt, ist der Implementierung für jede Verwendung vorbehalten.
    • Jeder Name, der mit einem Unterstrich beginnt, ist der Implementierung zur Verwendung als Name im globalen Namespace vorbehalten.
  • Reservierte Wörter in Programmiersprachen .

    Reservierte Wörter werden vom Programmierer möglicherweise nicht neu definiert, aber vordefinierte Wörter können häufig in gewisser Weise überschrieben werden. Dies ist der Fall bei main: Es gibt Bereiche, in denen eine Deklaration, die diesen Bezeichner verwendet, ihre Bedeutung neu definiert.

Manlio
quelle
- Ich glaube , ich bin eher durch die Tatsache , betört , dass (wie es ist so fehleranfällig), warum dies ist eine Warnung (kein Fehler), und warum es nur eine Warnung , wenn kompiliert wie C - Sicher, können Sie kompilieren , ohne eine main()Funktion, aber Sie können sie nicht als Programm verknüpfen. Was hier passiert ist, dass ein "gültiges" Programm ohne ein main(), nur ein verknüpft wird main.
Geoff Nixon
7
cinund endlsind nicht im Standard-Namespace - sie sind im stdNamespace. nposist Mitglied von std::basic_string.
AnotherParker
1
main ist als globaler Name reserviert. Keines der anderen Dinge, die Sie erwähnt haben main, ist vordefiniert.
Potatoswatter
1
Siehe C ++ 14 §3.6.1 und C11 §5.1.2.2.1 für Einschränkungen dessen, was sein maindarf. C ++ sagt "Eine Implementierung darf die Hauptfunktion nicht vordefinieren" und C sagt "Die Implementierung deklariert keinen Prototyp für diese Funktion."
Potatoswatter
@manlio: Bitte klären Sie, woraus Sie zitieren. Was einfaches C betrifft, sind die Zitate falsch. Ich denke, es ist einer der C ++ - Standards, nicht wahr?
Dhein
19

Ist int main;ein gültiges C / C ++ - Programm?

Es ist nicht ganz klar, was ein C / C ++ - Programm ist.

Ist int main;ein gültiges C-Programm?

Ja. Eine freistehende Implementierung darf ein solches Programm akzeptieren. mainmuss in einer freistehenden Umgebung keine besondere Bedeutung haben.

Es ist in einer gehosteten Umgebung nicht gültig.

Ist int main;ein gültiges C ++ - Programm?

Das Gleiche gilt.

Warum stürzt es ab?

Das Programm muss in Ihrer Umgebung keinen Sinn ergeben . In einer freistehenden Umgebung sind der Start und die Beendigung des Programms sowie die Bedeutung von mainimplementierungsdefiniert.

Warum warnt mich der Compiler?

Der Compiler kann Sie vor allem warnen, was ihm gefällt, solange er keine konformen Programme ablehnt. Auf der anderen Seite ist nur eine Warnung erforderlich, um ein nicht konformes Programm zu diagnostizieren. Da diese Übersetzungseinheit nicht Teil eines gültigen gehosteten Programms sein kann, ist eine Diagnosemeldung gerechtfertigt.

Ist gcceine freistehende Umgebung oder eine gehostete Umgebung?

Ja.

gccdokumentiert das -ffreestandingKompilierungsflag. Fügen Sie es hinzu, und die Warnung verschwindet. Sie können es verwenden, wenn Sie z. B. Kernel oder Firmware erstellen.

g++dokumentiert solche Flagge nicht. Die Bereitstellung scheint keine Auswirkungen auf dieses Programm zu haben. Es ist wahrscheinlich sicher anzunehmen, dass die von g ++ bereitgestellte Umgebung gehostet wird. Das Fehlen einer Diagnose ist in diesem Fall ein Fehler.

n. 'Pronomen' m.
quelle
17

Dies ist eine Warnung, da sie technisch nicht unzulässig ist. Der Startcode verwendet die Symbolposition von "main" und springt mit den drei Standardargumenten (argc, argv und envp) dorthin. Dies ist nicht der Fall und kann zum Zeitpunkt der Verknüpfung nicht überprüfen, ob es sich tatsächlich um eine Funktion handelt oder ob diese Argumente vorhanden sind. Dies ist auch der Grund, warum int main (int argc, char ** argv) funktioniert - der Compiler kennt das envp-Argument nicht und es wird einfach nicht verwendet, und es handelt sich um eine Aufruferbereinigung.

Als Witz könnte man so etwas machen

int main = 0xCBCBCBCB;

Auf einem x86-Computer wird es nicht nur kompiliert, sondern funktioniert auch, wenn Warnungen und ähnliches ignoriert werden.

Jemand hat eine ähnliche Technik verwendet, um eine ausführbare Datei (eine Art) zu schreiben, die direkt auf mehreren Architekturen ausgeführt wird - http://phrack.org/issues/57/17.html#article . Es wurde auch verwendet, um die IOCCC zu gewinnen - http://www.ioccc.org/1984/mullender/mullender.c .

dascandy
quelle
1
"Es ist eine Warnung, da sie technisch nicht unzulässig ist" - sie ist in C ++ ungültig.
Prost und hth. - Alf
3
"die drei Standardargumente (argc, argv und envp)" - hier sprechen Sie möglicherweise über den Posix-Standard.
Prost und hth. - Alf
Auf meinem System (Ubuntu 14 / x64) funktioniert die folgende Zeile mit gcc:int main __attribute__ ((section (".text")))= 0xC3C3C3C3;
csharpfolk
@ Cheersandhth.-Alf Die ersten beiden sind Standard, der dritte ist POSIX.
Dascandy
9

Ist es ein gültiges Programm?

Nein.

Es ist kein Programm, da es keine ausführbaren Teile enthält.

Ist es gültig zu kompilieren?

Ja.

Kann es mit einem gültigen Programm verwendet werden?

Ja.

Nicht jeder kompilierte Code muss ausführbar sein, um gültig zu sein. Beispiele sind statische und dynamische Bibliotheken.

Sie haben effektiv eine Objektdatei erstellt. Es ist keine gültige ausführbare Datei, jedoch kann ein anderes Programm eine Verknüpfung zu dem Objekt mainin der resultierenden Datei herstellen, indem es zur Laufzeit geladen wird.

Sollte dies ein Fehler sein?

Traditionell erlaubt C ++ dem Benutzer, Dinge zu tun, die so aussehen, als hätten sie keine gültige Verwendung, aber die zur Syntax der Sprache passen.

Ich meine, das könnte sicher als Fehler eingestuft werden, aber warum? Welchen Zweck würde das erfüllen, den die Warnung nicht erfüllt?

Solange theoretisch die Möglichkeit besteht, dass diese Funktionalität im eigentlichen Code verwendet wird, ist es sehr unwahrscheinlich, dass ein aufgerufenes mainNichtfunktionsobjekt zu einem sprachlichen Fehler führt.

Michael Gazonda
quelle
Es wird ein extern sichtbares Symbol mit dem Namen erstellt main. Wie kann ein gültiges Programm, für das eine extern sichtbare Funktion benannt sein muss main, darauf verlinken?
Keith Thompson
@KeithThompson Zur Laufzeit laden. Wird klarstellen.
Michael Gazonda
Dies kann, weil es nicht in der Lage ist, den Unterschied zwischen Symboltypen zu erkennen. Das Verknüpfen funktioniert einwandfrei - die Ausführung (außer im sorgfältig ausgearbeiteten Fall) nicht.
Chris Stratton
1
@ChrisStratton: Ich denke, Keith argumentiert, dass die Verknüpfung fehlschlägt, weil das Symbol mehrfach definiert ist ... weil das "gültige Programm" kein gültiges Programm wäre, wenn es keine mainFunktion definiert .
Ben Voigt
@BenVoigt Wenn es jedoch in einer Bibliothek angezeigt wird, schlägt die Verknüpfung nicht fehl (und kann wahrscheinlich auch nicht), da die int main;Definition zur Programmverknüpfungszeit nicht sichtbar ist.
6

Ich möchte die bereits gegebenen Antworten unter Berufung auf die tatsächlichen Sprachstandards ergänzen.

Ist 'int main;' ein gültiges C-Programm?

Kurze Antwort (meiner Meinung nach): Nur wenn Ihre Implementierung eine "freistehende Ausführungsumgebung" verwendet.

Alle folgenden Zitate aus C11

5. Umwelt

Eine Implementierung übersetzt C-Quelldateien und führt C-Programme in zwei Datenverarbeitungssystemumgebungen aus, die als Übersetzungsumgebung und Ausführungsumgebung [...] bezeichnet werden.

5.1.2 Ausführungsumgebungen

Es werden zwei Ausführungsumgebungen definiert: freistehend und gehostet. In beiden Fällen erfolgt der Programmstart, wenn eine bestimmte C-Funktion von der Ausführungsumgebung aufgerufen wird.

5.1.2.1 Freistehende Umgebung

In einer freistehenden Umgebung (in der die Ausführung des C-Programms ohne Nutzen eines Betriebssystems erfolgen kann) sind Name und Typ der beim Programmstart aufgerufenen Funktion implementierungsdefiniert.

5.1.2.2 Gehostete Umgebung

Eine gehostete Umgebung muss nicht bereitgestellt werden, muss jedoch den folgenden Spezifikationen entsprechen, falls vorhanden.

5.1.2.2.1 Programmstart

Die beim Programmstart aufgerufene Funktion heißt main . [...] Sie muss mit einem Rückgabetyp von int und ohne Parameter [...] oder mit zwei Parametern [...] oder gleichwertig oder auf eine andere implementierungsdefinierte Weise definiert werden.

Von diesen wird folgendes beobachtet:

  • Ein C11-Programm kann eine freistehende oder eine gehostete Ausführungsumgebung haben und gültig sein.
  • Wenn es eine freistehende hat, muss es keine Hauptfunktion geben.
  • Andernfalls muss es eines mit einem Rückgabewert vom Typ int geben .

In einer freistehenden Ausführungsumgebung würde ich argumentieren, dass es sich um ein gültiges Programm handelt, das keinen Start zulässt, da dafür keine Funktion vorhanden ist, wie in 5.1.2 erforderlich. In einer gehosteten Ausführungsumgebung kann Ihr Code zwar ein Objekt mit dem Namen main einführen , aber keinen Rückgabewert bereitstellen. Daher würde ich argumentieren, dass es in diesem Sinne kein gültiges Programm ist, obwohl man auch vorher argumentieren könnte, wenn das Programm dies nicht ist soll ausgeführt werden (on möchte möglicherweise nur Daten bereitstellen), dann erlaubt es einfach nicht, genau das zu tun.

Ist 'int main;' ein gültiges C ++ - Programm?

Kurze Antwort (meiner Meinung nach): Nur wenn Ihre Implementierung eine "freistehende Ausführungsumgebung" verwendet.

Zitat aus C ++ 14

3.6.1 Hauptfunktion

Ein Programm muss eine globale Funktion namens main enthalten, die den festgelegten Start des Programms darstellt. Es ist implementierungsdefiniert, ob ein Programm in einer freistehenden Umgebung erforderlich ist, um eine Hauptfunktion zu definieren. [...] Es muss einen Rückgabetyp vom Typ int haben, ansonsten ist sein Typ implementierungsdefiniert. [...] Der Name main ist nicht anderweitig reserviert.

Im Gegensatz zum C11-Standard gelten hier weniger Einschränkungen für die freistehende Ausführungsumgebung, da überhaupt keine Startfunktion erwähnt wird, während für eine gehostete Ausführungsumgebung der Fall so ziemlich der gleiche ist wie für C11.

Wieder würde ich argumentieren, dass Ihr Code für den gehosteten Fall kein gültiges C ++ 14-Programm ist, aber ich bin sicher, dass es für den freistehenden Fall ist.

Da meine Antwort nur die Ausführungsumgebung berücksichtigt , denke ich, dass die Antwort von dasblinkenlicht ins Spiel kommt, da die Namensverfälschung in der Übersetzungsumgebung vorher erfolgt. Hier bin ich mir nicht so sicher, ob die obigen Zitate so streng eingehalten werden.

Ingo Schalk-Schupp
quelle
4

Mein Punkt ist wohl, dass ich wirklich denke, dass dies ein Fehler in einer gehosteten Umgebung sein sollte, oder?

Der Fehler liegt bei Ihnen. Sie hat nicht angegeben was eine Funktion mit dem Namen , maindass die Renditen ein intund versucht , das Programm in einer gehosteten Umgebung zu verwenden.

Angenommen, Sie haben eine Kompilierungseinheit, die eine globale Variable mit dem Namen definiert main. Dies kann in einer freistehenden Umgebung durchaus legal sein, da das, was ein Programm ausmacht, der Implementierung in freistehenden Umgebungen überlassen bleibt.

Angenommen, Sie haben eine andere Kompilierungseinheit, die eine globale Funktion mit dem Namen definiert, die eine mainzurückgibt intund keine Argumente akzeptiert. Genau das benötigt ein Programm in einer gehosteten Umgebung.

Alles ist in Ordnung, wenn Sie nur die erste Kompilierungseinheit in einer freistehenden Umgebung und die zweite nur in einer gehosteten Umgebung verwenden. Was ist, wenn Sie beide in einem Programm verwenden? In C ++ haben Sie die One-Definition-Regel verletzt. Das ist undefiniertes Verhalten. In C haben Sie gegen die Regel verstoßen, die vorschreibt, dass alle Verweise auf ein einzelnes Symbol konsistent sein müssen. Wenn nicht, ist es undefiniertes Verhalten. Undefiniertes Verhalten ist ein "Raus aus dem Gefängnis, frei!" Karte an Entwickler einer Implementierung. Alles, was eine Implementierung als Reaktion auf undefiniertes Verhalten tut, entspricht dem Standard. Die Implementierung muss nicht vor undefiniertem Verhalten warnen oder gar erkennen.

Was ist, wenn Sie nur eine dieser Kompilierungseinheiten verwenden, aber die falsche (was Sie getan haben)? In C ist die Situation eindeutig. Wenn die Funktion mainin einer der beiden Standardformen in einer gehosteten Umgebung nicht definiert wird, ist dies ein undefiniertes Verhalten. Angenommen, Sie haben überhaupt nicht definiert main. Der Compiler / Linker muss nichts zu diesem Fehler sagen. Dass sie sich beschweren, ist eine nette Sache in ihrem Namen. Dass das C-Programm fehlerfrei kompiliert und verknüpft wurde, ist Ihre Schuld, nicht die des Compilers.

In C ++ ist dies etwas weniger klar, da das Versagen beim Definieren der Funktion mainin einer gehosteten Umgebung eher ein Fehler als ein undefiniertes Verhalten ist (mit anderen Worten, es muss diagnostiziert werden). Die einzige Definitionsregel in C ++ bedeutet jedoch, dass Linker ziemlich dumm sein können. Die Aufgabe des Linkers besteht darin, externe Referenzen aufzulösen, und dank der One-Definition-Regel muss der Linker nicht wissen, was diese Symbole bedeuten. Sie haben ein Symbol mit dem Namen angegeben main. Der Linker erwartet ein Symbol mit dem Namen . Für den Linker ist mainalso alles in Ordnung.

David Hammen
quelle
4

Für C ist es bisher ein implementierungsdefiniertes Verhalten.

Wie die ISO / IEC9899 sagt:

5.1.2.2.1 Programmstart

1 Die beim Programmstart aufgerufene Funktion heißt main. Die Implementierung deklariert keinen Prototyp für diese Funktion. Es muss mit einem Rückgabetyp von int und ohne Parameter definiert werden:

int main(void) { /* ... */ }

oder mit zwei Parametern (hier als argc und argv bezeichnet, obwohl beliebige Namen verwendet werden können, da sie für die Funktion, in der sie deklariert sind, lokal sind):

int main(int argc, char *argv[]) { /* ... */ }

oder gleichwertig; oder auf eine andere implementierungsdefinierte Weise.

Dhein
quelle
3

Nein, dies ist kein gültiges Programm.

Für C ++ wurde dies kürzlich durch den Fehlerbericht 1886: Sprachverknüpfung für main (), der besagt:

Es scheint keine Einschränkung zu geben, main () eine explizite Sprachverknüpfung zu geben, aber es sollte wahrscheinlich entweder schlecht geformt oder bedingt unterstützt sein.

und ein Teil der Entschließung enthielt die folgende Änderung:

Ein Programm, das eine Variable main im globalen Bereich deklariert oder den Namen main mit C-Sprachverknüpfung (in einem beliebigen Namespace) deklariert, ist fehlerhaft.

Wir finden diesen Wortlaut im neuesten C ++ - Entwurfsstandard N4527 , dem C ++ 1z-Entwurf.

Die neuesten Versionen von clang und gcc machen dies jetzt zu einem Fehler ( sehen Sie es live ):

error: main cannot be declared as global variable
int main;
^

Vor diesem Fehlerbericht war es ein undefiniertes Verhalten, für das keine Diagnose erforderlich ist. Auf der anderen Seite erfordert schlecht geformter Code eine Diagnose. Der Compiler kann dies entweder als Warnung oder als Fehler ausgeben.

Shafik Yaghmour
quelle
Danke für das Update! Schön zu sehen, dass dies jetzt mit der Compiler-Diagnose aufgegriffen wird. Ich muss jedoch sagen, dass ich die Änderungen im C ++ - Standard verwirrend finde. (Hintergrundinformationen finden Sie in den obigen Kommentaren zur Namensverknüpfung von main().) Ich verstehe die Gründe dafür, main()dass eine explizite Verknüpfungsspezifikation nicht zulässig ist , aber ich verstehe nicht , dass main()eine C ++ - Verknüpfung erforderlich ist . Natürlich funktioniert der Standard nicht direkt Adresse wie ABI Verknüpfung / namen Mangeln zu handhaben , aber in der Praxis ( zum Beispiel mit Itanium ABI) würde dies mangle main()an _Z4mainv. Was vermisse ich?
Geoff Nixon
Ich denke, der Kommentar von Supercat deckt das ab. Wenn die Implementierung vor dem Aufrufen des benutzerdefinierten Hauptgeräts ihre eigene Aufgabe ausführt, kann sie leicht einen verstümmelten Namen aufrufen.
Shafik Yaghmour