我已經嘗試了很多解決方案,但都沒有工作。在WP8項目中調試C++運行時組件
- printf(「Test:%d」,123);
- std :: cout < <「Test」< < std :: endl;
- ...
其實我設置像this我的項目的調試器,我可以使用OutputDebugStringA("Test");
控制檯來寫,但這個函數不接受一個以上的參數。
如何打印這樣的內容:("Test : %d", 123)
?
我已經嘗試了很多解決方案,但都沒有工作。在WP8項目中調試C++運行時組件
其實我設置像this我的項目的調試器,我可以使用OutputDebugStringA("Test");
控制檯來寫,但這個函數不接受一個以上的參數。
如何打印這樣的內容:("Test : %d", 123)
?
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);
我發現在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
妖怪的答案是正確的軌道上,但我不喜歡在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");
看來, Visual Studio 2013不支持可變模板:( – Bogy
嗯,我使用VS2013進行Win 8.1項目。也許它需要更新1已經出來? –
我在我的Mac上使用虛擬化的Windows 8(使用Parallel Desktop 8),我不想升級到8.1,因爲VM不完全兼容... – Bogy