自学内容网 自学内容网

C/CC 不定参函数

1.不定参宏函数

  1. __FILE__ 是我们当前文件名的宏 char*
  2. __LINE__ 是此行行号的宏 int
  3. ...支持不定参数,后面跟__VA_ARGS__
  4. 不定参数为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)!