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

dor*_*mon 6 c++ c++11

嗨,我正在阅读std::optional 这里的实现,我在其单元测试文件中找到以下行.

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__) = []
Run Code Online (Sandbox Code Playgroud)

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

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

for*_*818 10

您可以在预处理后查看输出(-E对于gcc)...

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

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(); };
Run Code Online (Sandbox Code Playgroud)

预处理后,最后一行变为:

caller __VAR10 = []{ foo(); };
Run Code Online (Sandbox Code Playgroud)

__VAR和未使用的NAME*有点困惑.但是,[]{ foo(); }是一个lambda,用于callercallers构造函数中创建一个gets调用.

*=我想这个想法如下:假设您收到一条错误消息,说明您__VAR10在线10找到了错误TEST(disengaged_ctor),即.在NAME失败的试验.

  • 可能NAME只是为了提高可读性. (2认同)