C Library <stdarg.h>
<stdarg.h>
This header defines macros to access the individual arguments of a list of unnamed arguments whose number and types are not known to the called function.
A function may accept a varying number of additional arguments without corresponding parameter declarations by including a comma and three dots (,...) after its regular named parameters:
A function may accept a varying number of additional arguments without corresponding parameter declarations by including a comma and three dots (,...) after its regular named parameters:
return_type function_name (parameter_declarations,...);
To access these additional arguments the macros va_start, va_arg and va_end, declared in this header, can be used:
To access these additional arguments the macros va_start, va_arg and va_end, declared in this header, can be used:
- First, va_start initializes the list of variable arguments as a va_list.
- Subsequent executions of va_arg yield the values of the additional arguments in the same order as passed to the function.
- Finally, va_end shall be executed before the function returns.
Library Variable
- va_list
- This is a type suitable for holding information needed by the three macros va_start(), va_arg() and va_end().
- Before a function that has initialized a va_list object with va_start returns, the va_end macro shall be invoked.
- The specifics of this type depend on the particular library implementation. Objects of this type shall only be used as argument for the va_start, va_arg and va_end, and va_copy macros, or functions that use them, like the variable argument functions in <cstdio.h>
Library Macros
- va_start
- The C library macro void va_start(va_list ap, last_arg) initializes apvariable to be used with the va_arg and va_end macros.
- The last_arg is the last known fixed argument being passed to the function i.e. the argument before the ellipsis/(,...).
- This macro must be called before using va_arg and va_end.
- Declaration: void va_start(va_list ap, last_arg);
- parameter -> ap - This is the object of va_list and it will hold the information needed to retrieve the additional arguments with va_arg.
- last_arg − This is the last known fixed argument being passed to the function.
- va_arg
- The C library macro type va_arg(va_list ap, type) retrieves the next argument in the parameter list of the function with type.
- This does not determine whether the retrieved argument is the last argument passed to the function.
- Declaration: type va_arg(va_list ap, type)
- parameter -> ap - This is the object of type va_list with information about the additional arguments and their retrieval state. This object should be initialized by an initial call to va_start before the first call to va_arg.
- parameter -> type - This is a type name. This type name is used as the type of the expression, this macro expands to.
- This macro returns the next additional argument as an expression of type type.
- va_end
- The C library macro void va_end(va_list ap) allows a function with variable arguments which used the va_start macro to return.
- If va_end is not called before returning from the function, the result is undefined.
- Declaration: void va_end (va_list ap)
- parameter -> ap - This is the va_list object previously initialized by va_start in the same function.
- This macro does not return any value.
Example 1:
#include <stdarg.h>
#include <stdio.h>
int sum(int, ...);
int main()
{
printf("Sum of 15 and 56 = %d\n", sum(2, 15, 56) );
return 0;
}
int sum(int num_args, ...)
{
int val = 0;
va_list ap;
int i;
va_start(ap, num_args);
for(i = 0; i < num_args; i++)
{
val += va_arg(ap, int);
}
va_end(ap);
return val;
}
Example 2:
#include <stdarg.h>
#include <stdio.h>
int mul(int, ...);
int main()
{
printf("15 * 12 = %d\n", mul(2, 15, 12) );
return 0;
}
int mul(int num_args, ...)
{
int val = 1;
va_list ap;
int i;
va_start(ap, num_args);
for(i = 0; i < num_args; i++)
{
val *= va_arg(ap, int);
}
va_end(ap);
return val;
}
Tidak ada komentar:
Posting Komentar