用于构建类和函数字符串的 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

感谢 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/

相关文章:

c++ - 从 C++ 错误中的不同文件调用函数

c++ - C++ 中如何使用内联说明符来保留一个定义规则?

java - JNI : Library is Found on Path, 但方法不是 (java.lang.UnsatisfiedLinkError)

c++ - Windows 编译器上的 timespec

c++ - 二进制字面量?

c++ - GLSL 150 GL 3.2 黑色纹理

c++ - 用不同的值初始化 vector

c++ - 修改后的动态背包 - 有问题的输入?

c++ - vector有推回时间限制吗

c++ - C2065 'cout' : undeclared identifier