书籍:《Visual C++ 2017从入门到精通》的2.7 字符串
环境:visual studio 2022
内容:几个字符串类型->(将单字节char*转换为宽字节wchar_t *)(将宽字节wchar_t* 转换为单字节char *)
问题:AfxMessageBox()显示的内容不正常,想要添加日志查看。
以下是关于 MFC TRACE
宏 的详细使用说明,涵盖其功能、参数、示例及注意事项:
TRACE
是 MFC 提供的调试输出宏,用于在 调试模式 下将格式化字符串输出到 Visual Studio 的 Output 窗口。它类似于 C 语言的 printf
,但专为 MFC 项目设计,支持 MFC 类型(如 CString
)的格式化。
afx.h
。TRACE
宏默认生效。_DEBUG
宏才能生效(默认未定义)。int TRACE(
LPCTSTR lpszFormat, // 格式化字符串(支持 MFC 类型)
... // 可变参数列表
);
lpszFormat
(格式化字符串)**支持以下格式说明符:
说明符 | 对应类型 | 示例 |
---|---|---|
%d |
int |
TRACE("%d", 10); |
%s |
LPCTSTR (宽/窄字符) |
TRACE("%s", str); |
%f |
double |
TRACE("%.2f", 3.14); |
%p |
指针地址(void* ) |
TRACE("%p", hWnd); |
%ld |
LONG |
TRACE("%ld", 100000L); |
根据格式化字符串中的占位符,按顺序传递对应类型的参数。
void TestTraceBasic() {
int age = 25;
CString name = _T("Alice");
TRACE(_T("姓名: %s, 年龄: %d
"), name, age);
}
输出结果:
姓名: Alice, 年龄: 25
void TestTracePointer() {
CWnd* pWnd = GetDesktopWindow();
TRACE(_T("桌面窗口句柄: 0x%p
"), pWnd);
}
void TestTraceFloat() {
double pi = 3.1415926;
TRACE(_T("圆周率: %.2f
"), pi); // 输出两位小数
}
void TestTraceMixed() {
CString str = _T("Hello");
int num = 100;
double value = 200.5;
TRACE(_T("字符串: %s, 整数: %d, 浮点数: %.1f
"), str, num, value);
}
调试模式生效:
TRACE
仅在 调试模式(Debug)下输出内容,发布模式(Release)默认忽略。_DEBUG
宏: #define _DEBUG
输出窗口位置:
Debug
→ Windows
→ Output
打开输出窗口。性能影响:
TRACE
会增加运行时开销,建议仅在调试时使用,发布版本中移除或注释掉。类型安全:
多字节与宽字符:
TRACE
支持 LPCTSTR
,自动适配项目字符集(ANSI 或 Unicode)。%s
对应 wchar_t*
;若为 ANSI,%s
对应 char*
。若需将调试信息保存到文件,可结合 CStdioFile
:
#include
void TraceToFile(LPCTSTR message) {
CStdioFile file;
if (file.Open(_T("debug.log"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite)) {
CString logEntry;
COleDateTime time = COleDateTime::GetCurrentTime();
logEntry.Format(_T("[%s] %s
"), time.Format(_T("%Y-%m-%d %H:%M:%S")), message);
file.WriteString(logEntry);
file.Close();
}
}
// 使用示例
void TestTraceToFile() {
TRACE(_T("这条信息会同时输出到窗口和文件"));
TraceToFile(_T("这条信息仅保存到文件"));
}
通过宏封装实现不同日志级别:
#define LOG_INFO(format, ...) TRACE(_T("[INFO] ") format, ##__VA_ARGS__)
#define LOG_WARNING(format, ...) TRACE(_T("[WARNING] ") format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) TRACE(_T("[ERROR] ") format, ##__VA_ARGS__)
// 使用示例
void TestCustomLogLevel() {
LOG_INFO(_T("程序启动成功"));
LOG_WARNING(_T("内存不足"));
LOG_ERROR(_T("文件加载失败"));
}
TRACE
输出不显示?afx.h
头文件。%d
对应整数)。CString
的完整内容?%s
: CString str = _T("测试字符串");
TRACE(_T("CString 内容: %s"), str);
%p
: int* pInt = new int(10);
TRACE(_T("指针地址: 0x%p"), pInt);
场景 | 示例代码 |
---|---|
基础输出 | TRACE(_T("Hello, %s!"), _T("MFC")); |
输出变量值 | TRACE(_T("数值: %d"), 42); |
调试指针地址 | TRACE(_T("指针: 0x%p"), pObject); |
混合类型输出 | TRACE(_T("混合: %s, %d, %.2f"), str, num, value); |
通过合理使用 TRACE
宏,可以显著提升调试效率,快速定位问题。