2012-10-15 2 views
1

va_arg을 variadic 함수에서 전달 된 인수의 수보다 적은 횟수로 호출하면 정의되지 않은 동작이 발생합니까? 예를 들어전달 된 인수의 수보다 va_arg가 더 짧음

:

#include <stdarg.h> 
void foo(unsigned n, ...) { 
    va_list ap; 
    int bar = 0; 

    va_start(ap, n); 
    if (n) bar = va_arg(ap,int); 
    // Do something with bar 
} 

int main() { 
    foo(2, 3, 4); 
    return 0; 
} 

그 프로그램이 정의되지 않은 동작이 발생할 것인가

?

답변

7

일 경우 정의되지 않은 동작이 발생하지만 사용자가 va_arg을 사용하는 방식이 아닙니다. 그것은 단지 추가 인수를 무시하는 것입니다, 그래서 그것을 포함하는 타이핑 낭비처럼 보입니다.

정의되지 않은 동작은 사용자가 해당 기능에 va_end을 포함시키지 않았기 때문에 발생합니다. 사양 (7.15.1.1 va_arg 매크로)에서

는 :

va_arg 매크로 수정 ap 호출 할 때마다 연속적인 인수의 값은 다시 반환됩니다 그래서. 실제 다음 인수가없는 경우 ... 동작은 ...

7.15.1.3 va_end 매크로에서 정의되지 않은 : ...

va_end 경우 매크로가 반환 전에 호출되지 않으면 동작이 정의되지 않습니다.

va_arg을 특정 횟수만큼 호출해야한다는 언급이 없습니다. 보시다시피, va_end이 중요합니다.

0

va_arg은 전달 된 순서대로 인수를 반환하도록 정의됩니다. 인수보다 호출 횟수가 적 으면 추가 인수를 무시합니다.

+0

이 답변은 일종의 "반 수정"입니다. 'va_arg '에 대한 호출 횟수는 중요하지 않지만 (너무 많지 않은 한) OP 프로그램은 정의되지 않은 동작을합니다. –

관련 문제