Una función del parámetro variable representa: Tipo de diversión (int num, ...)
Donde el tipo representa el tipo de valor de retorno de la función, NUM representa el número de parámetros, y "..." indica todos los parámetros.
Ejemplo: diversión char (int num, ...);
Dos, va_list, va_start (), va_arg (), va_end () la función y el significado original de la representación.
1, va_list: representa la lista de parámetros.
2, va_start (): una lista de parámetros de inicialización.
3, va_arg (): Obtener un diferentes parámetros de tipo.
4, va_end (): Vaciar la lista de parámetros.
5, char * typedef va_list;
#define _INTSIZEOF (n) ((sizeof (n) + sizeof (int) -1) y ~ (sizeof (int) - 1))
#define va_start (ap, v) (ap = (va_list) y v + _INTSIZEOF (v ))
#define va_arg (ap, t) (* (t *) ((ap + = _INTSIZEOF (t)) - _INTSIZEOF (t)))
#define va_end (ap) (ap = (va_list) 0)
6, (a + b-1) y ~ (b-1): cuando A y B son ambos n-ésima potencia de 2, se puede obtener el más pequeño múltiplo de la máxima de a y b.
Por lo tanto, (sizeof (n) + sizeof ( int) -1) y ~ (sizeof (int) - 1) se puede utilizar para la alineación de bytes.
#include <stdio.h> #include <stdarg.h> int FUNC ( int NUM, ...) // NUM representativo del número de parámetros { Char ** ARR; int Inter [ 2 ]; Doble Dou [ 3. ]; int I; la lista va_list; // lista de parámetros del va_start (lista, NUM); // inicialización lista de parámetros para (i = 0 ; I < 2 ; I ++ ) { Inter [I] = la va_arg (lista, int ); // Get int tipo de parámetro printf ( " inter [% d] =% d \ n " , i, entre [i]); } para (i = 0 ; i < 3 ; i ++ ) { Dou [i] = va_arg (lista, doble ); // 获取doble类型参数[Warning] 'float' es promovido a 'doble' cuando pasa a través '...' printf ( " Dou [% d] =% lf \ n " , i, Dou [i]); } para (i = 0 ; i < 5 ; i ++ ) { arr [i] = va_arg (lista, Char *); // 获取int类型参数 printf ( " arr [% d] =% s \ n " , i, arr [i]) ; } volver 0 ; } Int main () { func ( 10 , 1 , 2 , 1,0 , 2,0 , 3,0 , " aaa " , " bbb " , " ccc " , " ddd " , " eee " ); }