我正在尝试自动生成一个可在调试日志中使用的字符串,我想要的语法是:
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
感谢 P.W.
最佳答案
如果您想在 Visual Studio 中以 ClassName::FunctionName
格式打印,__FUNCTION__
是最合适的。因此,您必须将其放在条件包含 (#ifdef
s) 层次结构的首位。
#if defined(__FUNCTION__)
#define FNAME __FUNCTION__
...
...
#else
#define FNAME ""
#endif
您可以现场观看here .
关于用于构建类和函数字符串的 C++ 可移植方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53392464/