c++ - C++ 可移植方法来构建类和函数字符串
问题描述
我正在尝试自动生成一个可以在调试日志中使用的字符串,我想要的语法是:
ClassName::FunctionName
源代码可用于具有不同编译器的两个系统,包括:
Microsoft Visual Studio 2010, Version 10.0.40219.1 SP1Rel
和
QNX Momentics, Version 4.7
到目前为止,我已经尝试过:
#if defined(__FUNCDNAME__)
#define FNAME __FUNCDNAME__
#elif defined(__FUNCTION__)
#define FNAME __FUNCTION__
#elif defined(__FUNSIG__)
#define FNAME __FUNSIG__
#elif defined(__func__)
#define FNAME __func__
#elif defined(__PRETTY_FUNCTION__)
#define FNAME __PRETTY_FUNCTION__
#else
#define FNAME ""
#endif
然后我添加了一些测试代码,这样我就可以在调试器中看到结果:
char szTemp[128];
strcpy_s(szTemp, sizeof(szTemp), FNAME);
结果不是我所追求的:
??0CLSNAME@@QAE@AAV?$SecBlock@EV?$AllocatorWithCleanup@ES0A@@@@@@0_N@Z
我不知道这是什么。
[编辑]我改变了预处理器,让我对正在发生的事情有更多的了解,现在代码如下:
szFrom[0] = '\0';
#if defined(__PRETTY_FUNCTION__)
#define FNAME __PRETTY_FUNCTION__
strcpy_s(szFrom, sizeof(szFrom), FNAME);
#endif
#if defined(__FUNCTION__)
#define FNAME __FUNCTION__
strcpy_s(szFrom, sizeof(szFrom), FNAME);
#endif
#if defined(__FUNCDNAME__)
#define FNAME __FUNCDNAME__
strcpy_s(szFrom, sizeof(szFrom), FNAME);
#endif
#if defined(__FUNSIG__)
#define FNAME __FUNSIG__
strcpy_s(szFrom, sizeof(szFrom), FNAME);
#endif
#if defined(__func__)
#define FNAME __func__
strcpy_s(szFrom, sizeof(szFrom), FNAME);
#endif
使用 MSVC 时,我可以看到流程和丑陋的输出来自funcdname,这是流程进入的唯一条件。
[编辑 2] 最终工作解决方案:
szFrom[0] = '\0';
#if defined(__PRETTY_FUNCTION__)
#define FNAME __PRETTY_FUNCTION__
strcpy_s(szFrom, sizeof(szFrom), FNAME);
#endif
#if defined(__FUNCTION__)
#define FNAME __FUNCTION__
strcpy_s(szFrom, sizeof(szFrom), FNAME);
#endif
#if defined(__FUNSIG__)
#define FNAME __FUNSIG__
strcpy_s(szFrom, sizeof(szFrom), FNAME);
#endif
#if defined(__func__)
#define FNAME __func__
strcpy_s(szFrom, sizeof(szFrom), FNAME);
#endif
在 MSVC 上,这给出了输出:
ClassName::FunctionName
感谢私信
解决方案
如果要ClassName::FunctionName
在 Visual Studio 中以格式打印,__FUNCTION__
是最合适的。所以你必须把它放在你的条件包含(#ifdef
s)的层次结构中。
#if defined(__FUNCTION__)
#define FNAME __FUNCTION__
...
...
#else
#define FNAME ""
#endif
你可以在这里看到它。
推荐阅读
- polygon - 使用 Polygon 裁剪光栅文件并使用相同的文件名写入输出
- mysql - Laravel DB Builder 使用字符串变量作为整数 ID
- ios - 如何在tableView(Swift)中删除行后立即选择另一行
- c# - C# 使用 X509Chain 签署 XML 文档
- vue.js - 用于电子邮件验证的正则表达式规则在 vuejs 中不起作用
- javascript - 如何通过单击反应引导表 2 中的列单元格来制作弹出框或选择具有不同选项的选项?
- c# - 二维数组中连续三个值c#
- android - 从版本控制中提取后的 Android 矢量资产致命异常
- java - Drools 指定的编码不生效
- c# - 使用 Contrl+(Shift)+Tab 在 Pivot Control 中循环浏览选项卡/标题?(UWP)