Kann die Argumente der Haupt Unterschrift in C ++, die nicht signiert und const-Qualifikation hat? [Duplikat]

StackOverflow https://stackoverflow.com/questions/1621574

  •  06-07-2019
  •  | 
  •  

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?

War es hilfreich?

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 von main erlauben: int main() und int 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top