2 Stimmen

Ist es legal, Funktionsprototypen innerhalb von main oder einer anderen Funktion zu verwenden?

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?

5voto

paulsm4 Punkte 106654

Es ist eindeutig am besten, Prototypen in eine eigene Kopfzeile zu stellen; außerhalb einer Funktion :)

Trotzdem ist es legal:

#include <stdio.h>

int
main (int argc, char *argv[])
{
  void foo ();

  foo ();
  return 0;
}

void foo ()
{
  printf ("Foo!\n");
}

2voto

Jonathan Leffler Punkte 694013

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X