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)…);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值