2013-04-12 10 views
0

나는 printf 또한 va_list
걸릴 것하지만 난 그렇게 할 때, printf 내가 printf하고 싶은 일을하지 않고, thougt :이상한 행동

void Log(int loglevel, char* string, ...) 
{ 
    va_list args; 
    va_start(args, string); 

    switch (type) 
    { 
     case LOGLEVEL_FATAL: 
      printf("FATAL: "); 
      break; 

     case LOGLEVEL_ERROR: 
      printf("ERROR: "); 
      break; 

     case LOGLEVEL_WARNING: 
      printf("WARNING: "); 
      break; 

     case LOGLEVEL_INFO: 
      printf("INFO: "); 
      break; 
    } 

    printf(string, args); 
    va_end(args); 
} 

내가 지금 호출 할 때 :

Log(LOGLEVEL_INFO, "testvariable = %f", 16.0); 

출력은 :

INFO: testvariable = 0.000000 
,

하지만 왜?
내 실수는 무엇입니까?

답변

3

최종 printf() 호출은 vprintf() (varargs의 경우 "v")이어야합니다.

+0

하지만 난()'의 printf'에'va_list'을 전달하면 오류가 발생합니다 해달라고 이유는 무엇입니까? – bricklore

+1

@ Schnizel1337 :'printf()'는 타입 안전하지 않기 때문입니다. 귀하의 경우에는'double'을 기대하고'va_list'를 얻습니다. 그러나 이것은 점검되지 않습니다. – NPE

+0

@ Schnizel1337'printf()'는 형식 지정자에 따라 아무 것도 받아들이고 인수 **만을 해석합니다 **. 'va_list'는 하나의 인자입니다. 'va_list '에 대한 형식 지정자를 보았습니까? – Angew

0

는 C++ 11에서 당신은 (헤더 파일)이 작업을 수행 할 수 있습니다

또한, 이론적으로, 당신은 string을 구문 분석하고 args 오른쪽 사람이 실제로 있는지 확인 할 것
template<typename... Args> 
void Log(int loglevel, char* string, Args&&... args) 
{ 
    switch (type) 
    { 
     case LOGLEVEL_FATAL: 
      printf("FATAL: "); 
      break; 

     case LOGLEVEL_ERROR: 
      printf("ERROR: "); 
      break; 

     case LOGLEVEL_WARNING: 
      printf("WARNING: "); 
      break; 

     case LOGLEVEL_INFO: 
      printf("INFO: "); 
      break; 
    } 

    printf(string, std::forward<Args>(args)...); 
} 

, 맹목적으로 부서지는 것보다.