C语言中如何将可变参数传递给另一个函数?
问题原因及解决方案
你的代码问题在于:make_error是接收可变参数(...)的函数,但在throw中直接传递va_list对象给它,这不符合函数的参数约定——...需要的是离散的可变参数,而非已经通过va_list打包好的参数集合。编译器无法检查可变参数的实际类型和数量,所以不会报错,但运行时参数解析会出错,导致函数无法正常工作。
解决方法是重构代码,新增一个专门接收va_list的核心函数,让两个可变参数函数都调用这个核心逻辑:
新增
va_list版本的核心函数
把原make_error中调用message_internal的逻辑移到这个函数里:void make_error_va(const char *line, unsigned int line_no, unsigned int char_no, unsigned int len, const char *error_message, va_list args) { message_internal("\033[31;1m", line, "error", line_no, char_no, len, error_message, args); }修改原
make_error函数
让它创建va_list后调用核心函数:void make_error(const char *line, unsigned int line_no, unsigned int char_no, unsigned int len, const char *error_message, ...) { va_list l; va_start(l, error_message); make_error_va(line, line_no, char_no, len, error_message, l); va_end(l); }修正
throw函数
直接调用va_list版本的核心函数,传递已准备好的va_list:void throw(SubstringInformation* info, const char* format, ...) { va_list l; va_start(l, format); make_error_va(info->line_content, info->line_in_file, info->char_in_line, info->text_len, format, l); va_end(l); }
这样处理后,可变参数会被正确传递和解析,函数就能正常工作了。
内容的提问来源于stack exchange,提问作者Tenobaal
相关产品推荐
相关产品推荐

