多级预处理器宏扰乱了字符串化的输出

Multi-level preprocessor macro messing up string-ized output

本文关键字:字符串 输出 乱了 预处理 处理器 多级      更新时间:2023-10-16

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

#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)

这一切都很完美,重新定义了谷歌测试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)

我的宏实时演示链接。

您的宏实时演示链接。