建个视频网站多少钱,常德网站制作公司多少钱,奢侈品的网站设计,wordpress手机拍照插件文章目录 专栏导读不定参函数C风格不定参函数不定参宏函数 专栏导读 #x1f338;作者简介#xff1a;花想云 #xff0c;在读本科生一枚#xff0c;C/C领域新星创作者#xff0c;新星计划导师#xff0c;阿里云专家博主#xff0c;CSDN内容合伙人…致力于 C/C、Linux 学… 文章目录 专栏导读不定参函数C风格不定参函数不定参宏函数 专栏导读 作者简介花想云 在读本科生一枚C/C领域新星创作者新星计划导师阿里云专家博主CSDN内容合伙人…致力于 C/C、Linux 学习。 专栏简介本文收录于 C项目——基于多设计模式下的同步与异步日志系统 相关专栏推荐C语言初阶系列、C语言进阶系列 、C系列、数据结构与算法、Linux 不定参函数
C语言中的不定参数函数是一种特殊类型的函数它允许你定义一个函数可以接受不定数量的参数。这些函数通常用于处理不确定数量的输入例如printf和scanf等标准库函数它们可以接受不同数量和类型的参数。
不定参函数的声明格式如下 return_type func_name (format_string, ...);return_type为函数返回值类型func_name为函数名format_string是一个格式化字符串用于指定参数的数量和类型... 表示不定数量的参数
在函数内部我们可以用一些宏或函数来对不定参数进行分解常见的宏有va_start、va_arg、va_end。 void va_start(va_list ap, last);type va_arg(va_list ap, type);void va_end(va_list ap);va_listva_list是一个类型用于声明一个参数列表的对象它的本质其实是void*va_start用于初始化va_list对象使其指向不定参数列表的第一个参数va_arg用于获取不定参数列表中的参数va_end用于清空可变参数列表
示例1
#include stdio.h
#include stdarg.hvoid printNum(int count, ...)
{va_list ap;va_start(ap, count); // 初始化ap指针使其指向不定参数列表的第一个参数for(int i 0; i count; i){int num va_arg(ap, int); // 从不定参数列表中抽取int类型的参数printf(%d , num);}printf(\n);va_end(ap); // 将ap置空
}int main()
{printNum(5, 1, 2, 3, 4, 5);return 0;
}示例2
#define _GNU_SOURCE#include stdio.h
#include stdarg.hvoid myprintf(const char* format, ...)
{va_list ap;va_start(ap, format);char* res;int ret vasprintf(res, format, ap);if(ret ! -1){printf(res);free(res); // res指向动态开辟的空间需要手动释放}va_end(ap);
}
int main()
{myprintf(%s-%d\n, huaxiangyun, 100);return 0;
}注意 示例中vasprintf 是一个 C 库函数它可以通过可变参数创建一个格式化的字符串并将其存储在动态分配的内存中。它的使用方法与 printf类似但它不会将结果打印到标准输出流中而是将其存储在一个指向字符数组的指针中。
函数原型如下
#include stdarg.h
#include stdio.hint vasprintf(char **str, const char *format, va_list ap);C风格不定参函数
在C中有两种主要方式来创建不定参数函数 C风格的不定参数函数这种方式与C语言中的不定参数函数类似使用了C标准库中的va_list、va_start、va_arg和va_end宏。这种方式在C中仍然有效但不够类型安全不太推荐在现代C代码中使用。 C11引入的可变参数模板这是更现代和类型安全的方式使用了C的模板和新的语法特性。可变参数模板允许你定义一个接受不定数量参数的函数并且能够在编译时进行类型检查。这种方式更灵活并且是C推荐的方式。
示例3
#include iostream// 无参特化
void xprintf()
{std::cout std::endl;
}template typename T, typename ...Args
void xprintf(const T v, Args ...args)
{std::cout v;if((sizeof ...(args)) 0){xprintf(std::forwardArgs(args)...); // 递归分解参数包}else{xprintf();}
}int main()
{xprintf(huaxinagyun);xprintf(aaaa, 1000);return 0;
}不定参宏函数
示例4
#include stdio.h#define LOG(format, ...) /printf([%s : %d]\n, format, __FILE__, __LINE__, ##__VA_ARGS__)int main()
{LOG(日志消息);return 0;
}