Parameter
Argumente sind Namen von Werten, die einer Funktion durch einen Funktionsaufruf übergeben werden. Parameter sind die Werte, deren Empfang die Funktion erwartet. In einem Funktionsprototyp enthalten die Klammern nach dem Funktionsnamen eine vollständige Liste der Funktionsparameter und ihrer Typen. Parameterdeklarationen geben die Typen, Größen und Bezeichner der Werte an, die in den Parametern gespeichert sind.
Syntax
function-definition
:
declaration-specifiers
opt attribute-seq
opt declarator
declaration-list
opt compound-statement
/* attribute-seq
ist Microsoft-spezifisch */
declarator
:
pointer
opt direct-declarator
direct-declarator
: /* Ein Funktionsdeklarator */
direct-declarator
(
parameter-type-list
)
/* Deklarator im neuen Format */
direct-declarator
(
identifier-list
opt )
/* Deklarator im veralteten Format */
parameter-type-list
: /* Die Parameterliste */
parameter-list
parameter-list
, ...
parameter-list
:
parameter-declaration
parameter-list
,
parameter-declaration
parameter-declaration
:
declaration-specifiers
declarator
declaration-specifiers
abstract-declarator
opt
Die parameter-type-list
ist eine Folge von Parameterdeklarationen, die durch Trennzeichen getrennt sind. Die Form jedes Parameters in einer Parameterliste sieht wie folgt aus:
register
opttype-specifier
declarator
opt
Funktionsparameter, die mit dem Attribut auto
deklariert sind, generieren Fehler. Die Bezeichner der Parameter werden im Funktionstext verwendet und beziehen sich auf die Werte, die der Funktion übergeben werden. Sie können die Parameter in einem Prototyp benennen, aber die Namen verlassen den Gültigkeitsbereich am Ende der Deklaration. Das bedeutet, dass Parameternamen in der Funktionsdefinition auf die gleiche oder eine andere Weise zugewiesen werden können. Diese Bezeichner können im äußersten Block des Funktionstexts nicht neu definiert werden, sie können jedoch in inneren, geschachtelten Blöcken neu definiert werden, so als wäre die Parameterliste ein einschließender Block.
Jedem Bezeichner in parameter-type-list
muss der entsprechende Typspezifizierer vorangestellt werden, wie in diesem Beispiel gezeigt:
void new( double x, double y, double z )
{
/* Function body here */
}
Wenn die Parameterliste mindestens einen Parameter enthält, kann die Liste mit einem Komma enden, gefolgt von drei Punkten ( , ...
). Diese Konstruktion, die so genannte „Ellipsenschreibweise“, gibt eine variable Anzahl von Argumenten für die Funktion an. (Weitere Informationen finden Sie unter Aufrufe mit einer variablen Anzahl von Argumenten.) Allerdings muss ein Aufruf der Funktion über mindestens so viele Argumente verfügen wie Parameter vor dem letzten Komma vorhanden sind.
Wenn keine Argumente an die Funktion übergeben werden sollen, wird die Liste der Parameter durch das Schlüsselwort void
ersetzt. Diese Verwendung von void
unterscheidet sich von der Verwendung als Typspezifizierer.
Reihenfolge und Typ der Parameter, einschließlich aller Auslassungsnotationen, müssen in allen Funktionsdeklarationen (falls vorhanden) und in der Funktionsdefinition gleich sein. Die Typen der Argumente nach üblichen arithmetische Konvertierungen müssen mit den Typen der entsprechenden Parameter zuweisungskompatibel sein. (Weitere Informationen zu arithmetischen Konvertierungen finden Sie unter Übliche arithmetische Konvertierungen.) Die Argumente, die den Auslassungszeichen folgen, werden nicht überprüft. Basis, Struktur, Union, Zeiger oder Arraytyp eines Parameters können beliebig sein.
Der Compiler führt die üblichen arithmetischen Konvertierungen unabhängig für jeden Parameter und ggf. für jedes Argument aus. Nach der Konvertierung ist kein Parameter kürzer als int
, und kein Parameter verfügt über einen float
-Typ, es sei denn, der Parametertyp ist im Prototyp explizit als float
angegeben. Das bedeutet beispielsweise, dass die Deklaration eines Parameters als char
denselben Effekt hat wie eine Deklaration als int
.