C語言不定引數的兩種實現
阿新 • • 發佈:2018-12-29
1、使用以下三個函式可實現不定引數
#include<stdarg.h>
void va_start(va_list ap, last);
type va_arg(va_list, type);
void va_end(va_list ap);
《1》、va_start
該函式用來初始化指標變數ap(va_list實際是void型別),之後處理引數就預設從ap開始處理。last一般為傳過來的引數列表的第一個引數。
《2》、va_arg
該函式就是將ap指標按照type型別向後移動,然後返回ap所指的那個引數。
注意:
type型別不能是float,其它不支援暫不知(測試過char
《3》、va_end
和va_start配套使用,做善後。
#include<stdarg.h> #include <stdio.h> //count 人為將引數個數傳遞進去 int test(int count, short first, ...) { va_list argp; int sum = 0; int tmp = 0; va_start(argp, first); printf("%d \t", first); for (int i = 1; i < count; ++i) { printf("%d \t", va_arg(argp,short)); } va_end(argp); return 0; } int main() { test(10, 5, 6, 8, 9, 10, 56, 89, 52, 21, 110); getchar(); return 0; }
2、可變引數巨集 …和__VA_ARGS__
C99規範中新增的巨集
#define debug(format, ...) fprintf(stdout, format, __VA_ARGS__) int test(int count, short first, ...) { va_list argp; int sum = 0; int tmp = 0; va_start(argp, first); printf("%d \t", first); for (int i = 1; i < count; ++i) { debug("%d \t", va_arg(argp,short)); //printf("%d \t", va_arg(argp,short)); } va_end(argp); return 0; }
3、參考
《1》、https://www.cnblogs.com/linhaostudy/p/6695422.html;
《2》、https://www.cnblogs.com/alexshi/archive/2012/03/09/2388453.html
8、