有一天看C代码看到某个方法有这样的定义:在函数形参列表处,有...
的写法,就像Java中的不定参数那样。
如:
int printf(const char * __restrict, ...) __printflike(1, 2);
int scanf(const char * __restrict, ...) __scanflike(1, 2);
那么C语言中的不定参数特性,是怎样使用的呢,以及我们如何利用该特性,封装自己的函数?
需要用到 stdarg.h
中的三个函数:
#define va_start(ap, param) __builtin_va_start(ap, param)
#define va_end(ap) __builtin_va_end(ap)
#define va_arg(ap, type) __builtin_va_arg(ap, type)
主要是测试一下上面提到的三个库函数的使用。
#include
#include // 声明列表的结束值
#define ARGUMENTS_END_VALUE -1void printMultiArgs(int firstArgs, ...) {// 声明参数列表的变量va_list ap;// 初始化参数列表va_start(ap, firstArgs);printf("%d\n", firstArgs);int currValue;while ((currValue = va_arg(ap, int)) != ARGUMENTS_END_VALUE) {printf("%d\n", currValue);}// 结束参数列表va_end(ap);
}int main(int argc, const char * argv[]) {printMultiArgs(1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE);return 0;
}
//
// main.c
// C不定参数
//
// Created by wuyujin1997 on 2023/1/23.
////#define va_start(ap, param) __builtin_va_start(ap, param)
//#define va_end(ap) __builtin_va_end(ap)
//#define va_arg(ap, type) __builtin_va_arg(ap, type)#include
#include // 声明列表的结束值
#define ARGUMENTS_END_VALUE -1void printMultiArgs(int firstArgs, ...) {// 声明参数列表的变量va_list ap;// 初始化参数列表va_start(ap, firstArgs);printf("%d\n", firstArgs);int currValue;while ((currValue = va_arg(ap, int)) != ARGUMENTS_END_VALUE) {printf("%d\n", currValue);}// 结束参数列表va_end(ap);
}/// 对多个int变量求和(需要提前约定好参数结束的标志值 ARGUMENTS_END_VALUE)
/// - Parameter firstArgs: <#firstArgs description#>
int sum1(int firstArgs, ...) {int result = 0;va_list ap;va_start(ap, firstArgs);result+= firstArgs; // 手动处理第一个参数int currValue;while ((currValue = va_arg(ap, int)) != ARGUMENTS_END_VALUE) {result += currValue;}va_end(ap);return result;
}/// 对多个int变量求和(需要主动本方法:不定参数的个数是多少)
/// - Parameters:
/// - count: 不定参数的个数
/// - firstArgs: 第一个参数,显式的形参
int sum2(int count, int firstArgs, ...) {int result = 0;va_list ap;va_start(ap, firstArgs);result += firstArgs;for (int i = 1; i < count; i++) {int currValue = va_arg(ap, int);
// printf("%d %d\n", i, currValue);result += currValue;}va_end(ap);return result;
}int main(int argc, const char * argv[]) {printMultiArgs(1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE);printf("sum1 %d\n", sum1(1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE));int LENGTH = 9;printf("sum2 %d\n", sum2(LENGTH, 1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE));return 0;
}
执行结果:
#include
va_list
ap
为 va_list
类型的变量。 va_start(ap, param)
param为不定参数列表的第一个参数。va_arg(ap, type)
不定参数中变量的类型吗,如int, short, long
等。va_end(ap)
上一篇:【HBase入门】2. 集群搭建
下一篇:AcWing第87场周赛题解