Funktionsaufrufe und Parameterumwandlungen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Funktionen - Index

Beim Aufruf einer Funktion werden die aktuellen Argumente in der Reihenfolge ihrer formalen Parameter aufgeführt. Die aktuellen Argumente werden – wie bei der Initialisierung – in die Typen der formalen Parameter konvertiert.

Im Folgenden sind die Regeln zusammengefasst, die festlegen, wie der Compiler mit und ohne Prototypen die Sprachmodifizierer und formalen Parameter in Funktionsaufrufen behandelt:

  • Die Sprachmodifizierer für eine Funktionsdefinition müssen mit den Modifizierern in der Funktionsdeklaration bei allen Aufrufen der Funktion übereinstimmen.
  • Eine Funktion kann die Werte ihrer formalen Parameter ändern. Dies hat aber keine Auswirkung auf die Argumente in der aufrufenden Routine. Die Ausnahme bilden Referenzargumente in C++.

Wurde kein Funktionsprototyp deklariert, konvertiert der Compiler Integerargumente in einem Funktionsaufruf entsprechend den Integer-Erweiterungsregeln, die im Abschnitt arithmetische Standard-Umwandlungen beschrieben sind. Steht im Gültigkeitsbereich ein Prototyp, dann konvertiert der Compiler das gegebene Argument in den Typ des deklarierten Parameters, genauso wie bei einer Zuweisung.

Enthält ein Funktionsprototyp ein Auslassungszeichen (...), dann konvertiert der Compiler alle vorhandenen Funktionsargumente – bis hin zum Auslassungszeichen – genauso wie bei jedem anderen Prototyp. Der Compiler konvertiert alle weiteren Argumente entsprechend den normalen Regeln für Funktionsargumente ohne Prototypen.

Ist ein Prototyp vorhanden, muss die Anzahl der Argumente mit der Anzahl der Parameter übereinstimmen (außer, es ist ein Auslassungszeichen vorhanden). Die Typen müssen nur soweit kompatibel sein, dass sie – bei einer Zuweisung – konvertiert werden können. Sie können immer eine explizite Typumwandlung (cast) zur Konvertierung eines Arguments in einen für den Funktionsprototyp zulässigen Typ verwenden.

Anmerkung:  Stimmt der Funktionsprototyp nicht mit der Funktionsdefinition überein, findet der Compiler dies nur dann heraus, wenn die Definition in derselben Übersetzungseinheit steht wie der Prototyp. Wenn Sie eine Bibliothek für Routinen mit einer entsprechenden Prototyp-Header-Datei anlegen, dann müssen Sie darauf achten, dass beim Compilieren der Bibliothek die Include-Datei mit einbezogen wird, damit jegliche Diskrepanzen zwischen den Prototypen und den Definitionen entdeckt werden. C++ verfügt über eine typensichere Bindung, so dass Unterschiede zwischen erwarteten und tatsächlichen Parametern durch den Linker ausgeschlossen werden.