C语言中可变参数函数的实现原理和使用方法是什么?
C语言中可变参数函数的实现原理和使用方法是什么?可变参数函数基础:基本定义 #include <stdarg.h> int sum(int count, ...) { va_list args; va_start(args, count); int total = 0; for (int i = 0; i < count; i++) { total += va_arg(args, int); } va_end(args); return total; } int result = sum(3, 10, 20, 30);核心宏 va_list args; // 声明参数列表 va_start(args, last); // 初始化参数列表 va_arg(args, type); // 获取下一个参数 va_end(args); // 清理参数列表典型应用场景:格式化输出 void debug_print(const char *format, ...) { va_list args; va_start(args, format); #ifdef DEBUG vprintf(format, args); #endif va_end(args); } debug_print("Value: %d, String: %s\n", 42, "Hello");自定义错误处理 void error_handler(int code, const char *format, ...) { va_list args; va_start(args, format); fprintf(stderr, "Error %d: ", code); vfprintf(stderr, format, args); fprintf(stderr, "\n"); va_end(args); } error_handler(404, "File %s not found", "config.txt");字符串构建 char* string_build(const char *format, ...) { va_list args; va_start(args, format); int size = vsnprintf(NULL, 0, format, args); va_end(args); char *buffer = malloc(size + 1); if (buffer) { va_start(args, format); vsnprintf(buffer, size + 1, format, args); va_end(args); } return buffer; }高级用法:类型安全检查 void safe_printf(const char *format, ...) { va_list args; va_start(args, format); const char *p = format; while (*p) { if (*p == '%') { p++; switch (*p) { case 'd': va_arg(args, int); break; case 'f': va_arg(args, double); break; case 's': va_arg(args, char*); break; } } p++; } va_end(args); }可变参数计数 int count_args(int first, ...) { if (first == -1) return 0; va_list args; va_start(args, first); int count = 1; int value; while ((value = va_arg(args, int)) != -1) { count++; } va_end(args); return count; }传递可变参数 void wrapper_printf(const char *format, ...) { va_list args; va_start(args, format); vprintf(format, args); va_end(args); }注意事项:参数类型匹配 // 危险:类型不匹配 void example(const char *format, ...) { va_list args; va_start(args, format); int i = va_arg(args, int); // 必须与实际参数类型匹配 double d = va_arg(args, double); va_end(args); }默认参数提升 void promoted_args(...) { va_list args; va_start(args, 0); // char 和 short 会提升为 int // float 会提升为 double int i = va_arg(args, int); double d = va_arg(args, double); va_end(args); }内存管理 void process_strings(...) { va_list args; va_start(args, 0); char *str; while ((str = va_arg(args, char*)) != NULL) { // 处理字符串 // 注意:不释放字符串 } va_end(args); }实际应用示例:日志系统 typedef enum { LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR } LogLevel; void log_message(LogLevel level, const char *format, ...) { const char *level_str[] = {"DEBUG", "INFO", "WARN", "ERROR"}; printf("[%s] ", level_str[level]); va_list args; va_start(args, format); vprintf(format, args); va_end(args); printf("\n"); }配置解析 void parse_config(const char *key, ...) { va_list args; va_start(args, key); void *ptr; while ((ptr = va_arg(args, void*)) != NULL) { // 解析配置并存储到指针 } va_end(args); } int port, timeout; parse_config("server", &port, &timeout, NULL);数组求和 double sum_array(int count, ...) { va_list args; va_start(args, count); double sum = 0.0; for (int i = 0; i < count; i++) { sum += va_arg(args, double); } va_end(args); return sum; } double result = sum_array(3, 1.5, 2.5, 3.5);