0

我已經嘗試了很多解決方案,但都沒有工作。在WP8項目中調試C++運行時組件

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

其實我設置像this我的項目的調試器,我可以使用OutputDebugStringA("Test");控制檯來寫,但這個函數不接受一個以上的參數。

如何打印這樣的內容:("Test : %d", 123)

回答

0

我終於找到這個解決方案(herehere):

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

我發現在Pluralsight一個C++ training這個代碼,我使用的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

我在我的Mac上使用虛擬化的Windows 8(使用Parallel Desktop 8),我不想升級到8.1,因爲VM不完全兼容... – Bogy

2

妖怪的答案是正確的軌道上,但我不喜歡在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"); 
相關問題