C语言可变参数传递方法及自定义格式化日志函数实现咨询
C语言可变参数日志函数实现
方案1:匹配原有写法的实现
该方案适配你给出的初始代码逻辑,依赖传入的可变参数个数num读取参数。需要注意的是C是强类型语言,没有额外类型标识的情况下无法自动识别可变参数的类型,因此该方案仅适用于参数类型固定的场景,扩展性较差:
#include <stdarg.h> #include <stdio.h> // 注意:标准库math.h中存在同名数学函数log,如果项目引入math.h请修改函数名 void log(const char* time, int num, ...) { va_list valist; va_start(valist, num); // 输出时间前缀 printf("%s", time); // 循环读取num个可变参数 for (int i = 0; i < num; i++) { // 适配测试用例的参数类型:第1个可变参数为int,第2个为字符串 if (i == 0) { int int_val = va_arg(valist, int); printf(" %d", int_val); } else if (i == 1) { char* str_val = va_arg(valist, char*); printf(" %s", str_val); } } printf("\n"); va_end(valist); } int main() { log("19:00", 2, 3, "abc"); return 0; }
运行后会直接输出你期望的结果:19:00 3 abc
方案2:支持格式化字符串的通用实现(更推荐)
该方案匹配你提出的更优用法需求,直接复用C标准库的格式化解析逻辑,支持所有printf兼容的格式化语法,适配任意类型的参数组合,扩展性和灵活性都更强,还可以自定义输出目标:
#include <stdarg.h> #include <stdio.h> // 基础版本:输出到标准输出 void log(const char* format, ...) { va_list valist; va_start(valist, format); // 直接调用标准库vprintf处理可变参数 vprintf(format, valist); printf("\n"); // 可选,自动追加换行 va_end(valist); } // 进阶版本:支持输出到指定文件流(比如日志文件) /* void log(FILE* output_fp, const char* format, ...) { va_list valist; va_start(valist, format); vfprintf(output_fp, format, valist); fprintf(output_fp, "\n"); va_end(valist); } */ int main() { int d = 3; char s[4] = "abc"; // C语言字符串字面量自动带结束符\0,不需要手动添加 log("%s %d %s", "19:00", d, s); // 进阶版本用法:输出到标准输出传stdout,输出到文件传fopen返回的文件指针即可 // log(stdout, "%s %d %s", "19:00", d, s); return 0; }
内容的提问来源于stack exchange,提问作者SAGALPREET SINGH
相关产品推荐
相关产品推荐

