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