gpt4 book ai didi

C++ 构建类和函数字符串的可移植方法

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:30 25 4
gpt4 key购买 nike

我正在尝试自动生成一个可以在调试日志中使用的字符串,我想要的语法是:

    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__最合适。因此,您必须将它放在条件包含层次结构 (#ifdefs) 的第一位。

#if defined(__FUNCTION__)
#define FNAME __FUNCTION__
...
...
#else
#define FNAME ""
#endif

直播可以看到here .

关于C++ 构建类和函数字符串的可移植方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53392464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com