You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何将可变参数传递给另一个函数?

问题原因及解决方案

你的代码问题在于:make_error是接收可变参数(...)的函数,但在throw中直接传递va_list对象给它,这不符合函数的参数约定——...需要的是离散的可变参数,而非已经通过va_list打包好的参数集合。编译器无法检查可变参数的实际类型和数量,所以不会报错,但运行时参数解析会出错,导致函数无法正常工作。

解决方法是重构代码,新增一个专门接收va_list的核心函数,让两个可变参数函数都调用这个核心逻辑:

  1. 新增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);
    }
    
  2. 修改原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);
    }
    
  3. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:48:16