2014-07-25 3 views
4

구현하지 않습니다,하지만 난에 정확히 방법을 모른다 :GCC는 더 이상 내가와 stdarg.h하는 varargs.h에서이 코드 조각을 변경해야 <varargs.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>." 

컴파일하고 실행해야하는 프로그램에는 몇 가지 유사한 조각이 있으며이를 변경하는 방법을 알아야합니다. 몇 가지 예를 쓸 수 있다면, 나는 만족할 것이다.

답변

5

<varargs.h>은 사전 표준 C 헤더입니다. 대신 <stdarg.h>을 사용하십시오. 차이점 :

  1. 이 함수는 적어도 하나의 명명 된 인수를 사용해야합니다.
  2. 함수를 프로토 타입 화해야합니다 (줄임표 료자를 사용).
  3. va_start 매크로는 다르게 작동합니다. 첫 번째 매크로는 va_list이고 두 번째 인수는 마지막으로 명명 된 인수의 이름입니다.

예 : GCC 번째 인자를 무시하지만 정확한주는 여부를 휴대하지 않다 :

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에.

4

당신은

#include <stdarg.h> 

va_ 매크로 구문이 동일하게 유지 포함해야합니다.

+0

올바른 내용입니다. 나는 또한 당신이 이제'll_log (...) {'문법을 사용할 수 있다고 덧붙였다.이 문법은'' –

+2

과 맞지 않았다. Wikipedia는 실제로 [변화에 대한 좋은 설명이있다] (http : // en .wikipedia.org/wiki/Stdarg.h # varargs.h) –

+0

매크로 구문이 동일하지 않습니다. ''시스템에서'va_dcl'의 비 외관을 무시하더라도'va_start()'매크로는 이전의''시스템과 새로운 (er)''시스템에서 하나의 인수를 취하는 것과는 다릅니다. –