书籍:《Visual C++ 2017从入门到精通》的2.7 字符串
环境:visual studio 2022
内容:几个字符串类型->(将单字节char*转换为宽字节wchar_t *)(将宽字节wchar_t* 转换为单字节char *)
问题:AfxMessageBox()显示的内容不正常,想要添加日志查看。
#include
void TestTrace() {
CString str = _T("Hello, MFC!");
int num = 42;
// 输出字符串和变量值
TRACE(_T("字符串: %s, 数字: %d
"), str, num);
}
输出位置
调试模式:在 Visual Studio 的 Output 窗口(菜单栏 → Debug → Windows → Output)。Release 模式:TRACE 宏默认失效(需定义 _DEBUG 宏才会生效)。
常用格式化符号
符号对应类型示例%dintTRACE("%d", 10);%sLPCTSTRTRACE("%s", str);%fdoubleTRACE("%.2f", 3.14);%p指针地址TRACE("%p", pObject);
2. 使用 OutputDebugString 函数
OutputDebugString 是 Win32 API 函数,直接向调试器输出字符串,适用于 非 MFC 项目 或需要更底层控制的场景。
基本用法
#include
void TestOutputDebugString() {
CString str = _T("Hello, Debug!");
OutputDebugString(str);
OutputDebugString(_T("
")); // 换行
}
输出到文件
若需将调试信息保存到文件,可结合文件操作:
#include
void LogToFile(LPCTSTR message) {
std::wofstream logFile("debug.log", std::ios::app);
if (logFile.is_open()) {
logFile << message << std::endl;
}
}
void TestLogToFile() {
LogToFile(_T("这是一条日志信息"));
}
3. 使用 CDebug 类(自定义封装)
通过封装 TRACE 或 OutputDebugString,可以简化调试代码并添加额外功能(如时间戳、日志级别)。
示例代码
#include
#include
class CDebug {
public:
enum LogLevel { INFO, WARNING, ERROR };
static void Log(LPCTSTR message, LogLevel level = INFO) {
CString logLevel;
switch (level) {
case INFO: logLevel = _T("[INFO]"); break;
case WARNING: logLevel = _T("[WARNING]"); break;
case ERROR: logLevel = _T("[ERROR]"); break;
}
// 添加时间戳
COleDateTime time = COleDateTime::GetCurrentTime();
CString timestamp = time.Format(_T("%Y-%m-%d %H:%M:%S"));
CString logMessage;
logMessage.Format(_T("%s %s: %s
"), timestamp, logLevel, message);
// 输出到调试窗口
TRACE(logMessage);
// 同时写入日志文件(可选)
// LogToFile(logMessage);
}
private:
static void LogToFile(LPCTSTR message) {
// 实现文件写入逻辑...
}
};
// 使用示例
void TestCustomDebug() {
CDebug::Log(_T("程序启动成功"), CDebug::INFO);
CDebug::Log(_T("资源加载失败"), CDebug::ERROR);
}
4. 使用 CString 的 Format 方法
CString 提供 Format 方法,可方便地格式化字符串后输出。
示例代码
CString str;
str.Format(_T("当前窗口句柄: 0x%p"), hWnd);
TRACE(str);
5. 调试输出到对话框
若需在调试时直接弹出对话框显示信息,可使用 AfxMessageBox 或自定义对话框。
示例代码
void TestDebugDialog() {
CString str = _T("调试信息");
AfxMessageBox(str);
}
注意事项
调试模式 vs 发布模式:
TRACE 宏仅在调试模式下生效(需定义 _DEBUG)。OutputDebugString 在调试器和发布模式下均有效,但需确保调试器(如 Visual Studio)处于监听状态。 性能影响:
调试输出会增加运行时开销,建议在发布版本中禁用或移除。 跨平台兼容性:
OutputDebugString 是 Windows 特有 API,若需跨平台,可使用条件编译或第三方日志库(如 spdlog)。 安全性:
避免在调试信息中暴露敏感数据(如密码、密钥)。
总结
方法适用场景优点缺点**TRACE 宏**快速调试、格式化输出简单易用,集成于 MFC仅限调试模式,依赖 Visual Studio**OutputDebugString**底层控制、非 MFC 项目跨线程安全,支持直接写入文件需手动处理格式化自定义 CDebug 类添加日志级别、时间戳等扩展功能灵活性高,可复用性强需额外开发成本**AfxMessageBox**紧急调试、弹窗提示直观显示信息阻塞线程,不适合频繁调用
根据需求选择合适的方法,平衡开发效率与运行时性能。