gpt4 book ai didi

c++ - 这几行代码作为C++中的一个小测试框架有什么用呢?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:10 25 4
gpt4 key购买 nike

您好,我正在阅读 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 函数中调用),所以我什至不确定编译后的二进制文件是否真的运行了测试。你能解释一下这是怎么回事吗?谢谢!

编辑:很确定在我运行二进制文件时执行了测试,但这是如何实现的?

最佳答案

您可以查看预处理后的输出(-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(); };

after preprocessing the last line turns to:

caller __VAR10 = []{ foo(); };

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

* = 我想这个想法是这样的:假设你收到一条错误消息,说 __VAR10 有错误,然后在 10 行你找到 TEST (disengaged_ctor),即。失败测试的 NAME

关于c++ - 这几行代码作为C++中的一个小测试框架有什么用呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45290485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com