GCC不再实现<varargs.h>

Dar*_*Boa 7 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;
}
Run Code Online (Sandbox Code Playgroud)

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

error "GCC no longer implements <varargs.h>."
error "Revise your code to use <stdarg.h>."
Run Code Online (Sandbox Code Playgroud)

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

maf*_*fso 10

<varargs.h>是一个预标准的C头; 使用<stdarg.h>来代替.差异:

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

例:

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;
}
Run Code Online (Sandbox Code Playgroud)

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


thi*_*his 5

你必须包括

#include <stdarg.h>
Run Code Online (Sandbox Code Playgroud)

va_宏语法保持不变.

  • 维基百科实际上[对变化有一个很好的描述](http://en.wikipedia.org/wiki/Stdarg.h#varargs.h) (2认同)