Ist es in der Sprache C++ zulässig, Funktionsprototypen innerhalb von main
oder eine andere Funktion? Ist dies eine schlechte Praxis? Warum sollte jemand Prototypen innerhalb von main einfügen?
Antworten
Zu viele Anzeigen?Ja, es ist legal - daran gibt es keinen Zweifel. In der Regel ist es aber nicht ratsam.
Ein Grund dafür, dass es nicht ratsam ist, ist, dass die Funktion dann nur (als Ergebnis dieser Deklaration) in dieser bestimmten Funktion verfügbar ist; andere Funktionen in derselben Datei können diese Deklaration nicht nutzen (aber die anderen Funktionen könnten ihre eigene Deklaration der Funktion enthalten - aber dann wiederholen Sie sich, was keine gute Idee ist).
Außerdem verlieren Sie den Hauptvorteil der Gegenkontrolle. Der beste Weg ist, dies zu tun:
- Wenn die Funktion in der gleichen Quelldatei definiert ist (und nicht außerhalb der Quelldatei verwendet wird), dann beschränken Sie ihren Geltungsbereich auf die Datei (
static
oder dem anonymen Namensraum oder im entsprechenden anderen Namensraum), und stellen Sie sicher, dass es entweder definiert oder deklariert ist, bevor es verwendet wird. - Wenn die Funktion in einer anderen Quelldatei definiert ist, sollte es einen Header geben, der die Funktion deklariert. Fügen Sie den Header sowohl in die Datei ein, die die Funktion definiert (um sicherzustellen, dass die Deklaration im Header mit der Definition übereinstimmt) als auch in die Dateien, die die Funktion verwenden.
Auf diese Weise müssen Sie, wenn Sie die Funktionsdeklaration ändern müssen, weniger Stellen ausfindig machen. Wenn Sie die Funktion an mehreren Stellen deklariert haben, müssen Sie alle Deklarationen auf einmal ändern. Natürlich müssen Sie bei einer ausreichend radikalen Änderung (zusätzliche Argumente oder weniger Argumente) die Funktionsaufrufe ändern; bei anderen Änderungen (wie dem Hinzufügen eines const
Qualifier zu einem Argument zu machen oder von "pass-by-value" zu "pass-by-reference" zu wechseln), müssen Sie möglicherweise nichts am Quelltext ändern; ein einfaches Neukompilieren kann ausreichend sein.