c++ - 多级预处理器宏搞乱了字符串化输出

标签 c++ visual-c++ googletest c-preprocessor

我们在 2 种不同的配置下构建了一个 MSVC++ 单元测试项目,以针对不同的实现运行相同的测试。由于每个测试运行两次,我们使用预处理器 ugliness 破解测试名称:

#if defined(XXX)
    #define _VER BUILDX
#elif defined(YYY)
    #define _VER BUILDY
#endif

#define _TEST_SUITE_NAME_PACKAGE(Suite,Package) Suite##_##Package
#define TEST_SUITE_NAME_PACKAGE(Suite,Package) _TEST_SUITE_NAME_PACKAGE(Suite,Package)
#define TEST_SUITE_NAME(Suite) TEST_SUITE_NAME_PACKAGE(Suite,_VER)

#define TEST(test_case_name, test_name) GTEST_TEST(TEST_SUITE_NAME(test_case_name), test_name)

这一切都很完美,重新定义了 google-test TEST 宏以使用字符串化技巧修改测试套件名称。

但是以下有效:

#define TEST_F(test_fixture, test_name)\
  GTEST_TEST_(TEST_SUITE_NAME(test_fixture), test_name, test_fixture, \
              ::testing::internal::GetTypeId<test_fixture>())

不是使用 TEST(StringTestSuite,EqualityTest) 输出类似 StringTestSuite_XXX.EqualityTest 的输出,使用 TEST_F 输出如下:

TEST_SUITE_NAME(StringTestSuite).EqualityTest

我可以通过一些简单的调整来让它工作吗?

作为引用,这里是 GTEST_TEST_ 的 gtest 代码.而在 gtest.h 中,GTEST_TEST 定义为:

#define GTEST_TEST(test_case_name, test_name)\
  GTEST_TEST_(test_case_name, test_name, \
              ::testing::Test, ::testing::internal::GetTestTypeId())

最佳答案

只需再添加一个宏即可实现多一层间接寻址,这样宏将在该层上进行计算:

#define TEST_F_I(test_fixture, test_name, original_name) \
    GTEST_TEST_(test_fixture, test_name, original_name, \
         ::testing::internal::GetTypeId<original_name>())

#define TEST_F(test_fixture, test_name) \
    TEST_F_I(TEST_SUITE_NAME(test_fixture), test_name, test_fixture)

My macro live demo link.

Your macro live demo link.

关于c++ - 多级预处理器宏搞乱了字符串化输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25603522/

相关文章:

c++ - msgpack:在不知道类型的情况下解压自定义类

c++ - 关于类类型静态数组的空初始化

c++ - Visual C++ 可以检查不匹配的原型(prototype)和实现吗?

c++ - 您可以使用旧的运行时库构建 Visual C++ 2013 吗?

c++ - 使用 gtest EXPECT_CALL 时出现竞争条件段错误,而另一个期望正在执行相同的方法

c++ - 如何使用 Google Test 测试 EXE? (2)

c++ - 在C++中执行非阻塞线程

c++ - placement new 以重新初始化具有引用成员的对象

c - 加载dll时访问冲突

c++ - 如何使用 .c 文件而不是 .cpp 文件在 google test 中编写测试类?