2012-07-04 2 views
4

다음 코드가 실행되면 gcc 컴파일러가 경고를 표시하고 프로그램이 중단됩니다. 왜 그럴 수 없습니까? 누군가가 그것을 분명히하면 큰 도움이 될 것입니다.가변 인수 형식이 c의 va_arg 함수

#include<stdio.h> 
#include<stdarg.h> 
int f(char c,...); 
int main() 
{ 
    char c=97,d=98; 
    f(c,d); 
    return 0; 
} 

int f(char c,...) 
{ 
    va_list li; 
    va_start(li,c); 
    char d=va_arg(li,char); 
    printf("%c\n",d); 
    va_end(li); 
} 

GCC이 나에게 말한다 : 가변 기능에

warning: 'char’ is promoted to ‘int’ when passed through ‘...’ [enabled by default] 
note: (so you should pass ‘int’ not ‘char’ to ‘va_arg’) 
note: if this code is reached, the program will abort 

답변

10

인수 기본 인수 프로모션를 받아야에게; int (예 : char)보다 작은 것은 먼저 int (그리고 floatdouble으로 변환 됨)으로 변환됩니다.

그래서 va_arg(li,char)은 결코 올바르지 않습니다. 대신 va_arg(li,int)을 사용하십시오.

+1

왜 k & r book에 언급되어 있지 않습니까? – Dhatri

+0

@vindhya : 나는 잘 모른다. –

+0

충분히 흥미로운 점은'va_arg()'을 가지고있는 컴파일러가'char'를 사용하는 경우'int'를 모을 수 있다는 것입니다. Microsoft Visual Studio 2005는'va_arg()'에 다음과 같이 선언되어 있습니다 :'#define _crt_va_arg (ap, t) (* (t *) (ap + = _INTSIZEOF (t)) - _INTSIZEOF ~define_INTSIZEOF (n) (sizeof (n) + sizeof (int) - 1) & ~ (sizeof (int) - 1))의 추가 매크로 정의' –

1

예, C 표준의 버릇입니다. 그러나 이것은 단지 va_arg()과 관련이있는 것처럼 보입니다.

이것을 극복하는 방법을 보려면 printf()의 다양한 구현을 살펴보십시오. 예를 들어 one in klibc은 읽기가 쉽습니다.

관련 문제