C++ 编程/代码/标准 C 库/函数/va arg
外观
语法 |
#include <cstdarg>
type va_arg( va_list argptr, type );
void va_end( va_list argptr );
void va_start( va_list argptr, last_parm );
|
va_arg() 宏用于向函数传递可变数量的参数。
- 首先,您必须调用 va_start(),并将有效的 va_list 和省略号 ("...") 前最后一个参数变量的名称作为参数传递。第一个参数可以是任何内容;一种使用方法是将其设置为一个整数,表示要传递的参数数量。
- 接下来,您调用 va_arg(),并将 va_list 和要返回的参数类型作为参数传递。va_arg() 的返回值是当前参数。
- 根据您拥有的参数数量重复调用 va_arg()。
- 最后,必须调用 va_end(),并将 va_list 作为参数传递,以便进行适当的清理。
int sum( int num, ... ) {
int answer = 0;
va_list argptr;
va_start( argptr, num );
for( ; num > 0; num-- ) {
answer += va_arg( argptr, int );
}
va_end( argptr );
return( answer );
}
int main( void ) {
int answer = sum( 4, 4, 3, 2, 1 );
printf( "The answer is %d\n", answer );
return( 0 );
}
此代码显示 10,即 4+3+2+1。
以下是另一个可变参数函数的示例,这是一个简单的打印函数
void my_printf( char *format, ... ) {
va_list argptr;
va_start( argptr, format );
while( *format != '\0' ) {
// string
if( *format == 's' ) {
char* s = va_arg( argptr, char * );
printf( "Printing a string: %s\n", s );
}
// character
else if( *format == 'c' ) {
char c = (char) va_arg( argptr, int );
printf( "Printing a character: %c\n", c );
break;
}
// integer
else if( *format == 'd' ) {
int d = va_arg( argptr, int );
printf( "Printing an integer: %d\n", d );
}
*format++;
}
va_end( argptr );
}
int main( void ) {
my_printf( "sdc", "This is a string", 29, 'X' );
return( 0 );
}
运行此代码时,将显示以下输出
Printing a string: This is a string Printing an integer: 29 Printing a character: X