这几行作为C ++中的一个小测试框架做了什么?

时间:2017-07-24 21:36:58

标签: c++ c++11

您好我正在阅读std::optional here的实现,并在单元测试文件中找到以下行。

struct caller {
    template <class T> caller(T fun) { fun(); }
};
# define CAT2(X, Y) X ## Y
# define CAT(X, Y) CAT2(X, Y)
# define TEST(NAME) caller CAT(__VAR, __LINE__) = []

我真的不明白这些线是做什么的。 caller似乎是调用函数的模板,但它如何用作caller CAT ...X ## Y在这里意味着什么?稍后在文件中,用户使用TEST定义单元测试,但它们没有出现在任何可执行代码中(我的意思是它们至少不在main函数中调用),所以我甚至不确定如果编译的二进制文件实际运行测试。你能解释一下这里发生了什么吗?谢谢!

编辑:非常确定在运行二进制文件时执行测试,但是如何实现?

1 个答案:

答案 0 :(得分:10)

您可以在预处理后查看输出(gcc为resizeImage() ...)

这是我添加宏的用法的代码:

-E

after preprocessing the last line turns to:

struct caller {
    template <class T> caller(T fun) { fun(); }
};
# define CAT2(X, Y) X ## Y
# define CAT(X, Y) CAT2(X, Y)
# define TEST(NAME) caller CAT(__VAR, __LINE__) = []

TEST(disengaged_ctor) { foo(); };

我对caller __VAR10 = []{ foo(); }; 和未使用的__VAR *感到有些困惑。但是,NAME是一个lambda,当用于创建[]{ foo(); }时,会在caller的构造函数中调用它。

* =我的想法如下:假设您收到一条错误消息,指出caller中有错误,然后在行__VAR10上找到10,即。失败测试的TEST(disengaged_ctor)