2012-04-01 56 views
0

我正在寻找一个可移植的调试类,因为我打算在各种平台上工作。这个类提供了通过XDebug.WriteLine(“我喜欢数字%d”,7)写消息的方法;它在内部重定向系统特定方法的参数。转发省略号参数时丢失数据

这需要我传递省略号数据作为参数。这是问题。它适用于整数,但在通过时丢失浮点数。

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'设法没有。如果你的编译器还不支持可变参数模板,那么看看boost使用操作符重载进行管理,它使得语法更清晰。 – 2012-04-01 18:31:39

+0

我没有意识到这一点。谢谢。你的回答给我的旅行时间超出了我的预期。 Boost看起来像一大堆图书馆,我会尝试一下,但为了直接的目的,我真的希望事情可以用简单的骨头来完成。 谢谢,虽然我会更深入地学习Boost。也明显VS2010不是C11,所以没有可变的模板呢。 http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx – 2012-04-01 19:57:40

+0

Boost是一个库的存储库,所以有很多它们,但幸运的是它们不是太相互依赖。我甚至从来没有看过一些图书馆,我的建议是在有特殊问题时检查Boost,看看有没有什么符合你的要求。 – 2012-04-02 06:18:04

回答

2

你不能前进一样,功能之间的可变参数,对于不能直接传递给argssprintf同样的原因(你必须使用一个特殊的vsprintf)。

我建议写一个odprintf的过载,它将一个va_list对象作为参数。 (并且为了避免duplication,那么就可以在新的过载方面实现原始的odprintf)。