2012-04-01 3 views
0

다양한 플랫폼에서 프로젝트를 수행 할 계획이므로 이식 가능한 디버그 클래스가 필요합니다. 이 클래스는 XDebug.WriteLine ("나는 숫자 % d"을 좋아한다.)를 통해 메시지를 작성하는 메소드를 제공한다. 내부적으로 인수를 시스템 특정 메소드로 리디렉션합니다.줄임표 전달시 데이터 손실 args

필자는 매개 변수로 줄임표 데이터를 전달해야합니다. 그리고 여기에 문제가 있습니다. 정수에서는 작동하지만 통과시에는 실수가 없습니다.

XDebug::WriteLine("Print numbers %f, %f",1.234, 3.210f); 
XDebug::odprintf(L"Print numbers %f, %f",1.234, 3.210f); 

출력

Print numbers 0.000000, 0.000000 
Print numbers 1.234000, 3.210000 

나는 인수가 엉망이 얻을 수있는 곳을 파악하는 것을 시도하고있다. 도와 주셔서 감사합니다. 전체 디버그 클래스는 아래에 있습니다. 당신은 앞으로 그런 기능 사이에 변수 인수 할 수

#pragma once 
#ifndef _XDEBUG_H_ 
#define _XDEBUG_H_ 

#include <stdio.h> 
#include <stdarg.h> 
#include <ctype.h> 
#include <Windows.h>; 

class XDebug 
{ 
public: 

    static void __cdecl WriteLine(const char* txt, ...){ 
     #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) 

     int stringSize = MultiByteToWideChar (CP_ACP, 0, txt, -1, NULL, 0); 
     wchar_t* buffer = new wchar_t[stringSize]; 
     MultiByteToWideChar(CP_UTF8 , 0 , txt, -1, buffer, stringSize); 

     va_list args; 
     va_start(args, txt); 
     XDebug::odprintf(buffer,args); 

     delete buffer; 

     #endif 
    } 

//private: 
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) 
    static void __cdecl odprintf(const wchar_t *format, ...){ 
    wchar_t buf[4096], *p = buf; 
    va_list args; 
    int  n; 

      va_start(args, format); 
      n = _vsnwprintf(p, sizeof buf - 3, format, args); // buf-3 is room for CR/LF/NUL 
      va_end(args); 

      p += (n < 0) ? sizeof buf - 3 : n; 

      while (p > buf && isspace(p[-1])) 
        *--p = '\0'; 

      *p++ = '\r'; 
      *p++ = '\n'; 
      *p = '\0'; 

      OutputDebugString(buf); 
    } 
#endif 
}; 

#endif 
+0

정말 필요한가요? *정말* ? 'Boost.Format'은하지 않고 관리합니다. 컴파일러가 가변성 템플릿을 아직 지원하지 않는 경우 연산자 오버로딩을 사용하여 부스트 관리를 살펴보면 더 명확한 구문을 만들 수 있습니다. –

+0

나는 그것을 몰랐다. 감사. 당신의 대답은 내가 예상했던 것보다 긴 여행을 보냈습니다. Boost는 방대한 라이브러리 세트처럼 보입니다. 그러나 그것을 즉시 시도 할 것입니다. 그러나 즉각적인 목적을 위해, 나는 물건들이 베어 뼈 단순성으로 이루어질 수 있기를 정말로 바라고 있습니다. 감사합니다. 부스트를 더 깊이 공부하겠습니다. 또한 분명히 VS2010은 C11이 아니기 때문에 아직 가변적 인 템플릿이 없습니다. http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx –

+0

부스트는 라이브러리 저장소이므로 많은 항목이 있지만 다행히도 상호 의존성이 없습니다. 내가 훑어 본 적이없는 도서관의 호언 장담이 있습니다. 나의 권고는 당신의 요구 사항과 일치하는 것이 있는지 특별한 문제가있을 때 부스트를 확인하는 것입니다. –

답변

2

, 당신은 sprintf에 직접 args를 전달할 수 없습니다 같은 이유로 (당신은 vsprintf 특별한을 사용해야합니다).

나는 의 오버로드에 va_list 개체를 매개 변수로 사용하는 것이 좋습니다. duplication을 피하기 위해 새로운 과부하의 측면에서 원래 odprintf을 구현할 수 있습니다.