2012-04-01 2 views
0

Я ищу, чтобы иметь портативный класс отладки, так как я планирую работать над проектом на разных платформах. Этот класс предоставляет методы для записи сообщений через XDebug.WriteLine («Мне нравится номер% d», 7); Что внутренне перенаправляет аргументы к системному конкретному методу.Потеря данных при пересылке ellipsis 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 кажется массивным набором библиотек, я попробую его, но для непосредственных целей я действительно надеюсь, что все может быть сделано с простой простотой. Спасибо, хотя я буду изучать Boost более подробно. Также, видимо, VS2010 не является C11, поэтому никаких вариационных шаблонов пока нет. http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx –

+0

Boost - это хранилище библиотек, поэтому их очень много, но, к счастью, они не слишком взаимозависимы. Есть двадцать тысяч библиотек, на которые я даже не взглянул, моя рекомендация - проверить Boost, когда у вас есть конкретная проблема, чтобы убедиться, что что-то соответствует вашим требованиям. –

ответ

2

Вы не можете вперед между функциями переменной длины, как, что, по той же причине, что вы не можете пройти args непосредственно sprintf (вы должны использовать специальный vsprintf).

Предлагаю написать перегрузку odprintf, которая в качестве параметра принимает объект va_list. (И чтобы избежать duplication, вы могли бы реализовать оригинал odprintf с точки зрения новой перегрузки.)

Смежные вопросы