嗨,我正在阅读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__) = []
我真的不明白这些线是做什么的.调用者似乎是一个调用函数的模板,但它如何用作调用者CAT …?
X ## Y在这里是什么意思?稍后在文件中,用户使用TEST定义单元测试,但它们没有出现在任何可执行代码中(我的意思是它们至少不在main函数中调用),所以我甚至不确定编译的二进制文件是否实际运行了测试.你能解释一下这里发生了什么吗?谢谢!
编辑:非常确定在运行二进制文件时执行测试,但是如何实现?
解决方法
您可以在预处理后查看输出(-E表示gcc)…
struct caller { template <class T> caller(T fun) { fun(); } }; # define CAT2(X,__LINE__) = [] TEST(disengaged_ctor) { foo(); };
after preprocessing the last line turns to:
caller __VAR10 = []{ foo(); };
我对__VAR和未使用的NAME *感到有些困惑.但是,[] {foo();用于创建调用者的lambda是在调用者构造函数中调用的.
* =我想这个想法如下:假设你收到一条错误信息,说__VAR10中有错误,然后在第10行找到TEST(disengaged_ctor),即.失败测试的名称.
原文地址:https://www.jb51.cc/c/111206.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。