C/CC 不定参函数
文章目录
1.不定参宏函数
__FILE__
是我们当前文件名的宏 char*__LINE__
是此行行号的宏 int...
支持不定参数,后面跟__VA_ARGS__
- 不定参数为0个时,
__VA_ARGS__
前面跟##
,__VA_ARGS__
前面的逗号会自动删除
2.处理变长参数
va函数
stdarg.h 是 C 语言标准库中的一个头文件,用于处理变长参数(variable arguments)。
这些是宏函数。
va_list
是一个类型,用于访问变长参数。
va_start()
初始化一个 va_list 类型的变量。第二个参数是函数的最后一个已知的命名参数。
va_arg()
访问变长参数中的每一个参数,需要指定要访问的参数类型。
va_end()
用来清理 va_list,使得它不再指向变长参数列表。
vasprintf()
vasprintf 是一个在 C 语言中用于格式化字符串并返回一个动态分配内存的函数。
它类似于 sprintf,但不同之处在于它使用了 va_list 来处理变长参数,并且它会自动为格式化后的字符串分配足够的内存。返回的字符串需要由用户手动释放。
vasprintf 是 POSIX 标准的一部分,并不是 C 标准库的一部分,因此它在某些平台上可能不可用。在编写可移植代码时,应该确认该函数是否可用,或者使用其他方法来动态分配格式化字符串。
strp指针在外面要释放
3.C++ 不定参函数
c++的思想是递归处理。
#include <iostream>
#include <cstdarg>
#include <memory>
#include <functional>
void xprintf() {
std::cout << std::endl;
}
template<typename T, typename ...Args>
void xprintf(const T &value, Args ...args) {
std::cout << value << " ";
if ((sizeof ...(args)) > 0) {
xprintf(args...);
} else {
xprintf();
}
}
int main() {
xprintf("⽐特");
xprintf("⽐特", 666);
xprintf("⽐特", "就业课", 666);
return 0;
}
这里是一个变长参数模板函数 xprintf 。
无参的 xprintf 用于在递归结束时执行。
完美转发版本:
void xprintf() {
std::cout << std::endl;
}
template<typename T, typename ...Args>
void xprintf(const T &value, Args &&...args) {
std::cout << value << " ";
if ((sizeof ...(args)) > 0) {
xprintf(std::forward<Args>(args)...);
}else {
xprintf();
}
}
template<typename T, typename …Args>
typename… Args 表示模板参数包(parameter pack)。
参数中 Args… args
Args… args 表示函数参数包。
在函数内部,使用 args...
来访问这些参数。
sizeof …(args
)
返回的是参数包中包含的元素的数量,即参数个数。
args 是变长参数包的名字。
就是这个写法…
xprintf(std::forward(args)…);
原文地址:https://blog.csdn.net/JK01WYX/article/details/145101339
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!