The function declarator includes the list of parameters that can be passed to the function when it is called by another function, or by itself.
In C++, the parameter
list of a function is referred to as its signature. The name
and signature of a function uniquely identify it. As the word itself
suggests, the function signature is used by the compiler to distinguish
among the different instances of overloaded functions.
Function parameter declaration syntax .-,-------------. V | >>-(----+-----------+-+--+--------+--)------------------------->< '-parameter-' '-,--...-'
parameter >>-+----------+--type_specifier--+------------+---------------->< '-register-' '-declarator-'
An empty argument list
in a function declaration or definition indicates a function that
takes no arguments. To explicitly indicate that a function does not
take any arguments, you can declare the function in two ways: with
an empty parameter list, or with the keyword void: int f(void);
int f();
An
empty argument list in a function definition indicates that
a function that takes no arguments. An empty argument list in a function declaration indicates
that a function may take any number or type of arguments. Thus, int f()
{
...
}
indicates that function f takes no arguments.
However, int f();
simply indicates that the number and type of parameters
is not known. To explicitly indicate that a function does not take
any arguments, you can replace the argument list with
the keyword void.int f(void);
int f(int, ...);
The comma before the ellipsis is optional. In
addition, a parameter declaration is not required before the ellipsis.
At least one parameter declaration, as well as a comma before the
ellipsis, are both required in C.
In a function declaration,
or prototype, the type of each parameter must be specified.
In the function definition, the
type of each parameter must also be specified.
In the
function definition, if the type of a parameter is not specified,
it is assumed to be int.
struct X { int i; };
void print(struct X x);
The user-defined
type can also be defined within the parameter declaration.
The user-defined type can not be defined
within the parameter declaration. void print(struct X { int i; } x); // legal in C
void print(struct X { int i; } x); // error in C++
int func(int,long);
The following constraints apply to the use
of parameter names in function declarations: enum subway_line {yonge, university, spadina, bloor};
int subway(char * subway_line, int stations, subway_line intersects);
Except in certain contexts, an unsubscripted array name (for example, region instead of region[4]) represents a pointer whose value is the address of the first element of the array, provided that the array has previously been declared. An array type in the parameter list of a function is also converted to the corresponding pointer type. Information about the size of the argument array is lost when the array is accessed from within the function body.
To preserve this information, which is useful for optimization, you may declare the index of the argument array using the static keyword. The constant expression specifies the minimum pointer size that can be used as an assumption for optimizations. This particular usage of the static keyword is highly prescribed. The keyword may only appear in the outermost array type derivation and only in function parameter declarations. If the caller of the function does not abide by these restrictions, the behavior is undefined.
void foo(int arr [static 10]); /* arr points to the first of at least
10 ints */
void foo(int arr [const 10]); /* arr is a const pointer */
void foo(int arr [static const i]); /* arr points to at least i ints;
i is computed at run time. */
void foo(int arr [const static i]); /* alternate syntax to previous example */
void foo(int arr [const]); /* const pointer to int */