首页 > 解决方案 > 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

感谢私信

标签: c++

解决方案


如果要ClassName::FunctionName在 Visual Studio 中以格式打印,__FUNCTION__是最合适的。所以你必须把它放在你的条件包含(#ifdefs)的层次结构中。

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

你可以在这里看到它。


推荐阅读