ColoredPrintf 在最近的 googletest 中

ColoredPrintf in recent googletest

我使用的是相当过时的 GoogleTest 版本,并使用 hack 进行自定义打印,可在此处找到:How to send custom message in Google C++ Testing Framework?

我的来源包含来自上面 link 的以下代码

namespace testing
{
 namespace internal
 {
  enum GTestColor {
      COLOR_DEFAULT,
      COLOR_RED,
      COLOR_GREEN,
      COLOR_YELLOW
  };

  extern void ColoredPrintf(GTestColor color, const char* fmt, ...);
 }
}
#define PRINTF(...)  do { testing::internal::ColoredPrintf(testing::internal::COLOR_GREEN, "[          ] "); testing::internal::ColoredPrintf(testing::internal::COLOR_YELLOW, __VA_ARGS__); } while(0)

我已将项目中的 GoogleTest 源更新为主版本,现在我有 link 错误提示未定义 ColoredPrintf。

error LNK2019: unresolved external symbol "void __cdecl testing::internal::ColoredPrintf(enum testing::internal::`anonymous namespace'::GTestColor,char const *,...)" (?ColoredPrintf@internal@testing@@YAXW4GTestColor@?A0x313d419f@12@PEBDZZ) referenced in function

研究新鲜gtest.cc表明他们已经将GTestColor更改为枚举class并将其放入命名空间testing::internal内的匿名命名空间: https://github.com/google/googletest/blob/master/googletest/src/gtest.cc#L3138

我已将源代码中的片段更改为:

namespace testing {
    namespace internal
    {
        enum class GTestColor { kDefault, kRed, kGreen, kYellow };

        extern void ColoredPrintf(GTestColor color, const char* fmt, ...);
    }
}

作为快速修复,我删除了 gtest.ccGTestColor 左右的 namespace { ... }

问题:是否可以避免编辑 gtest.cc 并仍然可以访问它们的功能?

您不能访问编译单元之外的匿名命名空间中的成员。另见 this question.

根据您的 use-case 备选方案可能是:

  • 使用event listeners替换标准输出。
  • 通过修改输出的脚本对输出进行管道传输。
  • 让 Google 测试生成 XML 或 JSON 报告并根据 XML/JSON 报告生成输出。