Denken Sie daran, dass C und C++ zwei verschieden sind Sprachen. Die Antwort ist für beide ziemlich gleich, aber es lohnt sich, zu bedecken, was die C standard auch sagt - vor allem angesichts der Sprache-Anwalt-Tag. Die Verbindung ist zu dem N1570 Entwurf von C11.
Abschnitt 5.1.2.2.1 umfasst die Definition von main
für gehostete Implementierungen:
Die Funktion beim Programmstart aufgerufen genannt wird main
. Die Implementierung deklariert keinen Prototyp für diese Funktion.Es ist zu mit dem Rückgabetyp int
und ohne Parameter definiert:
int main(void) { /* ... */ }
oder mit zwei Parametern (hier bezeichnet als argc
und argv
, obwohl irgendwelche Namen kann verwendet werden, da sie lokal für die Funktion in sind, für die sie deklariert sind):
int main(int argc, char *argv[]) { /* ... */ }
oder gleichwertig; oder in einer anderen implementierungsdefinierten Weise.
Eine Definition mit zugesetztem const
oder volatile
Qualifier ist nicht gleichwertig auf die gezeigten Formen, also eine Implementierung, sie anzunehmen nicht verpflichtet ist. Da dieser Abschnitt jedoch kein Constraint ist, ist auch keine Implementierung erforderlich, um sich darüber zu beschweren. Und insbesondere, wenn eine Implementierung dokumentiert, dass sie const
und/oder volatile
Qualifizierer akzeptiert, dann sind sie perfekt für diese Implementierung.
(In der Praxis die meisten Compiler wird wahrscheinlich nicht beschweren.)
Beachten Sie, dass diese nur gehostet Implementierungen gilt. Für eine freistehende Implementierung (in der Regel für ein eingebettetes Ziel ohne OS):
... der Name und die Art der Funktion bei Programm Startup namens sind die Implementierung definiert.
(5.1.2.1 Absatz 1), was bedeutet, dass es keine tragbaren Definitionen der Hauptfunktion für freistehende Implementierungen (nicht einmal main
genannt werden muss).
Sie können es hinzufügen. – STF
@STF Ich sehe das, aber haben Sie eine Standardreferenz? Soweit ich mich erinnere (und ich habe jetzt nicht den Standard vor mir), wird die Signatur zu "int main()" oder "int main (int, char **)", oder syntaktischem Zucker, 'int main (int, char * [])'. – vsoftco
@Galik Warum? Die Zeiger sind nicht implizit konvertierbar, es ist kein standardmäßiger Verfall von Array zu Pointer. Also sollten die CV-Quals Teil der Signatur sein. Vielleicht vermisse ich hier etwas. – vsoftco