GCC不再实现<varargs.h> </varargs.h>

时间:2014-07-25 07:33:19

标签: c linux gcc gcc-warning

我必须将此代码片段从varargs.h更改为stdarg.h,但我不确切知道如何:

#ifndef lint
int ll_log (va_alist)
va_dcl
{
    int event, result;
    LLog   *lp;
    va_list ap;

    va_start (ap);

    lp = va_arg (ap, LLog *);
    event = va_arg (ap, int);

    result = _ll_log (lp, event, ap);

    va_end (ap);

    return result;
}

当我尝试构建它时,编译器说:

error "GCC no longer implements <varargs.h>."
error "Revise your code to use <stdarg.h>."

我需要编译和运行的程序有一些类似的片段,我需要知道如何更改它们。如果你能写一些例子,我会满意。

2 个答案:

答案 0 :(得分:8)

<varargs.h>是预标准的C标头;请改用<stdarg.h>。差异:

  1. 该函数必须至少使用一个命名参数。
  2. 该函数必须是原型(使用省略号终止符)。
  3. va_start宏的工作方式不同:它有两个参数,第一个是要初始化的va_list,第二个是最后一个命名参数的名称。
  4. 示例:

    int ll_log (LLog *llog, ...) {
        int event, result;
        LLog   *lp;
        va_list ap;
    
        va_start (ap, llog);
    
        lp = llog;
        event = va_arg (ap, int);
    
        result = _ll_log (lp, event, ap);
    
        va_end (ap);
        return result;
    }
    

    关于va_start:gcc忽略了第二个参数,但没有给出正确的参数不可移植。

答案 1 :(得分:5)

你必须包括

#include <stdarg.h>

va_宏语法保持不变。