0

Я пробовал много решений, но ни один из них не работает.Отладка C++ Runtime Component в проекте WP8

  • printf ("Test:% d", 123);
  • std :: cout < < "Test" < < std :: endl;
  • ...

На самом деле я установка отладчик моего проекта, как this, я могу написать в консоли с помощью OutputDebugStringA("Test");, но эта функция не принимает более одного параметра.

Как напечатать что-то вроде этого: ("Test : %d", 123)?

ответ

0

Я наконец-то нашел это решение (here и here):

Debug.cpp:

#pragma once 

#include "pch.h" 
#define BUFFER_LENGTH 1024 

//char* to wchar_t* 
const wchar_t *GetWC(const char *c) 
{ 
    const size_t cSize = strlen(c) + 1; 
    wchar_t* wc = new wchar_t[cSize]; 
    mbstowcs(wc, c, cSize); 

    return wc; 
} 

void Debug::Log(const char *format, ...) 
{ 
    char buffer[BUFFER_LENGTH]; 
    va_list args; 
    va_start(args, format); 
    vsnprintf(buffer, BUFFER_LENGTH, format, args); 
    va_end(args); 
    buffer[BUFFER_LENGTH - 1] = '\0'; //prevent buffer overflow 
    OutputDebugString(GetWC(buffer)); 
} 

Debug.h:

class Debug{ 
public: 
    static void Log(const char *format, ...); 
}; 

Мы можем использовать его как printf функции:

Debug::Log("Test : %d", 123); 
0

Я нашел этот код в C++ training на Pluralsight, что я использую для Windows 8 (вы просто говорите TRACE("Test : %d", 123); использовать):

#pragma once 
#include <assert.h> 

#define ASSERT assert 

#ifdef _DEBUG 
inline auto Trace(wchar_t const * format, ...) -> void 
{ 
    va_list args; 
    va_start(args, format); 

    wchar_t buffer[256]; 

    ASSERT(-1 != _vsnwprintf_s(buffer, _countof(buffer) - 1, format, args)); 
    va_end(args); 

    OutputDebugString(buffer); 
} 
#endif 

struct Tracer 
{ 
    char const * m_filename; 
    unsigned m_line; 

    Tracer(char const * filename, unsigned const line) : 
     m_filename{ filename }, 
     m_line{ line } 
    { 

    } 

    template <typename... Args> 
    auto operator()(wchar_t const * format, Args... args) const -> void 
    { 
     wchar_t buffer[256]; 

     auto count = swprintf_s(buffer, L"%S(%d): ", m_filename, m_line); 

     ASSERT(-1 != count); 

     ASSERT(-1 != _snwprintf_s(buffer + count, _countof(buffer) - count, _countof(buffer) - count - 1, format, args...)); 

     OutputDebugString(buffer); 
    } 
}; 

#ifdef _DEBUG 
#define TRACE Tracer(__FILE__, __LINE__) 
#else 
#define TRACE __noop 
#endif 
+0

кажется, что Visual Studio 2013 не поддерживает вариативные шаблоны :( – Bogy

+0

Хммм, я использовал VS2013 для проекта Win 8.1. Может быть, это требует обновления 1, который уже вышел? –

+0

Я использую виртуализованную Windows 8 на своем mac (используя Parallel Desktop 8), и я не хочу обновляться до 8.1, потому что VM не полностью совместима ... – Bogy

2

ответ Bogy находится на правильном пути, но мне не нравится распределение в GetWC, который выглядит как утечка памяти, и она использует небезопасные функции , попробуйте следующее:

void Debug::Log(const wchar_t *format, ...) 
{ 
    wchar_t buffer[BUFFER_LENGTH]; 
    va_list args; 
    va_start(args, format); 
    _vsnwprintf_s(buffer, BUFFER_LENGTH, _TRUNCATE, format, args); 
    va_end(args); 
    buffer[BUFFER_LENGTH - 1] = '\0'; //prevent buffer overflow 
    OutputDebugString(buffer); 
} 

Использование как:

Debug::Log(L"Hello %S\n", "sailor"); 
Смежные вопросы