您好我正在阅读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
函数中调用),所以我甚至不确定如果编译的二进制文件实际运行测试。你能解释一下这里发生了什么吗?谢谢!
编辑:非常确定在运行二进制文件时执行测试,但是如何实现?
答案 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)
。