多级预处理器宏扰乱了字符串化的输出
Multi-level preprocessor macro messing up string-ized output
我们在两种不同的配置下构建了一个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)
我的宏实时演示链接。
您的宏实时演示链接。
相关文章:
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在 C++ 中将双精度数组中的值"force convert"到字符串输出中?
- 尝试从 Visual Studios C++ 中的加密字符串输出解密字符串时出现逻辑错误
- C++添加到字符串(输出)
- 如何将非空终止字符串输出到 iostream,但保持格式
- 有没有一种简单的方法可以将矢量 int 集转换为字符串输出?
- 为什么将字符串输出到未命名的 std::ofstream 反而给了我一个十六进制数?
- CodeBlocks字符串输出定界线
- 如何获得字符串输出的宽度
- 为什么 cout 使用 << 生成正确的字符串输出,而不是使用 +?
- 是通过std :: Wostream定义的char*字符串输出
- 简单的字符串输出不符合预期(出现换行符)
- 使用字符串输出特定答案
- 如何在C++中从十六进制字符串输出 Unicode 字符
- 如何获取md5sum命令并获取代码中的字符串输出
- 需要帮助格式化字符串输出
- 快速C++字符串输出
- 与具有字符串输出参数的 WinAPI 函数的一致性是多少
- 用C++将二进制字符串输出到二进制文件
- Linux控制台的国际UTF-32字符串输出