Kann die Argumente der Haupt Unterschrift in C ++, die nicht signiert und const-Qualifikation hat? [Duplikat]
Frage
Diese Frage bereits eine Antwort hier:
- Was sollte main () Rückkehr in C und C ++? 17 Antworten
Der Standard weist ausdrücklich darauf hin, dass main
hat zwei gültige (das heißt, die garantiert arbeiten) Unterschriften; nämlich:
int main();
int main(int, char*[]);
Meine Frage ist einfach, wäre so etwas wie die folgenden legal sein?
int main(const unsigned int, const char* const* argv);
sagen Meine Tests mit ‚Ja‘, aber ich bin die Antwort nicht sicher, weil ich mir nicht main
Überlastung durch int
Wechsel sowie die nicht auf oberste Ebene unsigned int
-ness von argv const
? Wenn ich bin, dann ist das eindeutig verboten.
So sind diese Änderungen garantiert auf einem Standard arbeiten konformen Compiler?
Lösung
Der C ++ 98-Standard sagt in Abschnitt 3.6.1 Absatz 2
Eine Implementierung wird die Hauptfunktion nicht vordefinieren. Diese Funktion darf nicht überlastet werden. Es wird einen Rückgabetyp vom Typ
int
hat, aber sonst seine Art ist die Implementierung definiert. Alle Implementierungen müssen die beiden folgenden Definitionen vonmain
erlauben:int main()
undint main(int argc, char* argv[])
Es ist also nicht von der Norm vorgeschrieben, dass die env akzeptieren main
akzeptabel ist, aber es ist zulässig.
Da dies wird oft, hier ist der bisherige Absatz Freistellung freistehende Umgebungen von allem aber ihr Verhalten zu dokumentieren:
Ein Programm soll eine globale Funktion namens main, enthalten, die der designierte Start des Programms ist. Es ist Implementierung definiert ob ein Programm in einer frei stehenden Umgebung erforderlich, um eine Haupt definieren Funktion. [Anmerkung: in einer frei stehenden Umgebung, Inbetriebnahme und die Beendigung wird Implementierung definiert; Anlaufen enthält die Ausführung von Konstruktoren für Objekte des Namensraum-Bereichs mit statischer Speicherdauer; Beendigung enthält, um die Ausführung von Destruktoren für Objekte mit statischer Lagerdauer. ]
Andere Tipps
Sie müssen eine der Standard-konformen Signaturen verwenden Standard-konformer zu sein.
Ich verstehe, warum Sie es Ihren Weg machen wollen. Der beste Weg ist, Ihre eigene Funktion myMain () oder was auch immer mit der Signatur, die Sie wollen, zu schreiben und es aus dem Haupt () aufrufen, einschließlich der erforderlichen Abgüsse.
Die argv
Zeiger sollten nicht const char* const
werden, da das Programm erlaubt ist, die Puffer zu ändern.
Soweit ich aus der Lektüre den Standard sehen kann, sind Sie nicht-standardkonforme zu sein. Aber ich kann nicht einen Compiler vorstellen, dass Sie dies nicht zulassen, tun würde. Wie in, würde es mehr Arbeit vom Compiler, um speziell einen Rand Fall zu verbieten, die meist harmlos und sehr dunkel ist.
Das kann nicht funktionieren, wenn der Compiler Namen Mangeln für main
verwendet. Es ist eine C ++ Funktion, nachdem alle. Daher wird der Linker für zwei besondere „manglings“ suchen. Ihre Definition würde eine andere verstümmelten Namen haben.
Beachten Sie, dass main
Sonder ist (nicht, nicht aufrufbar nicht überlastet) und möglicherweise nicht Namen erfordern gar Mangeln.
Sie können von der Norm illegal sein, aber die meisten Runtimes kümmern sich nicht wirklich. Sie werden nur eine ganze Zahl für argc
drücken und einen Zeiger für argv
, rufen Sie Ihren main
, und hoffen, dass Sie sie richtig analysieren. Also, in Ihrem Zuständigkeitsbereich „garantiert zu arbeiten“, ist fraglich, wie der Lader nicht wirklich, was Sie die Argumente als deklariert haben.
Wenn es baut, wird main
aufgerufen. Wie Sie die Argumente analysieren, bleibt Ihnen überlassen. Ich möchte klarstellen, dass diese sehr plattformspezifisch ist, da fast das ganze Frage ist.
Wie gesagt, Warum?
ISO / IEC 9899: TC3
Abschnitt 5.1.2.2.1 Programmstart
Die Funktion beim Programmstart aufgerufen wird, den Name main. Die Umsetzung erklärt nicht Prototyp für diese Funktion. Sie gilt mit dem Rückgabetyp int definiert werden und mit nicht Parameter:
int main(void) { /* ... */ }
oder mit zwei Parametern (hier bezeichnet als argc und argv, obwohl alle Namen sein können, verwendet, da sie auf die Funktion lokal sind, in der sie deklariert sind):
int main(int argc, char *argv[]) { /* ... */ }
oder gleichwertig;. 9) oder in einer anderen Implementierung definiert Weise