Google Test 中的 Macro 到底是什么?

2020-09-30 14:35:29 +08:00
 Mindjet

Google Test 官方文档中得知,TEST()并不是函数,而是用来生成函数的宏。

Use the TEST() macro to define and name a test function. These are ordinary C++ functions that don't return a value.

从这句话来看,这些宏是属于 C++宏系统的。

Unfortunately, the C++ macro system does not allow us to create a single macro that can handle both types of tests. Using the wrong macro causes a compiler error.

但是搜索「 C++ 宏」,找到的内容都是关于用#define定义宏的,#define是预处理处理器的一种,又被称为「宏」。

但是这个也没有用#define,而且语法也不太对。

这是怎么回事呢?有谁知道?

2173 次点击
所在节点    程序员
18 条回复
ysc3839
2020-09-30 22:59:23 +08:00
感觉是初学 C++?建议先把基础学好再去研究更复杂的东西。

至于这个问题,TEST 是 Google Test 定义的宏,所以你去搜索“C++ 宏”找不到 Google Test 相关的内容。
Mindjet
2020-10-01 08:05:46 +08:00
@ysc3839 #1
那就好,宏是 Google Test 定义的,这个已经猜到了,谢谢你提供信息,这下证明猜测是基本正确的。
这个宏有没有利用 C++机制?
是完全由 Google Test 处理的,还是与 C++本身的机制有关?
Mindjet
2020-10-01 08:14:21 +08:00
@ysc3839 #1
是初学 C++没错了,是自学的,并不是要到了研究那一步,只是有对事物按捺不住的好奇心,想知道的更多点。
进一寸有一寸的欢喜,能知道多一点算一点。
AkideLiu
2020-10-02 16:21:31 +08:00
同时小白,不懂原理,就是写个 test case 用用
Mindjet
2020-10-02 16:42:54 +08:00
@AkideLiu ヽ(*^ー^)人(^ー^*)ノ

其实我感觉 @ysc3839 也不懂,他只清楚这是 Google Test 自定义的宏。

有空的时候我会再看一些资料,如果有比较有趣的发现发出来。
Mindjet
2020-10-02 16:46:15 +08:00
@AkideLiu #4

这是目前我的一些猜测,不一定对

### Google Test 中的宏 子专题

#### 重名问题

为什么可以允许相同的宏名(在.cpp 中定义大量 TEST 宏),这不是容易混淆吗?

由于宏的参数并没有类型,所以重载好像也无从谈起。

我的理解是这个,宏是由`Google Test`自带的预处理器进行处理的,所以这是特殊的语法,`(A,B)`里面的 A 和 B 才是真正的名字。

`TEST`起到识别作用,类似于二维码角落里那几个黑色方块,本身不会用来做名字,所以不会有名称上的冲突。

#### TEST()宏被用来生成无返回值的测试函数

从 Google Test 官方文档中得知,TEST()并不是函数,而是用来生成函数的宏,生成的函数是没有返回值的测试用函数,TEST()为其提供具体的定义方式和函数的名称。

> Use the TEST() macro to define and name a test function. These are ordinary C++ functions that don't return a value.
atempcode
2020-10-02 19:52:20 +08:00
宏和预编译都不懂就看 gtest,事倍功半。建议同 @ysc3839, 先把基础学好.
Mindjet
2020-10-02 20:05:59 +08:00
@atempcode
看样子你很懂啊,那能不能说几句话来证明这点呢?
Mindjet
2020-10-02 20:08:24 +08:00
这是种很典型的场景,某个人觉得自己非常懂,但却没有提供任何有价值的信息能证明这一点。
有很大的可能性是,那个人正是这群人里面最不懂的。
他的不懂已经到了一种程度,就是他不知道自己不懂。
Mindjet
2020-10-02 20:09:52 +08:00
这算是比较厉害的装逼方法,因为永远不可能露馅,他提供的信息几乎为 0,可能比去寺庙里抽签获得的信息要多点。
AkideLiu
2020-10-03 01:55:34 +08:00
@Mindjet 兄弟很有研究精神,我觉得要想搞清楚需要研读一些 Gtest 的源码,毕竟 Gtest 相比别的 unit test framework 规模更加庞大。
Mindjet
2020-10-03 08:27:56 +08:00
@AkideLiu #11
嗯嗯,好的ヽ( ̄▽ ̄)و
learningman
2020-10-03 13:33:12 +08:00
@Mindjet 但是还有一种可能,人家懂,但是懒得说。
能给你提供一个学习路径已经很不错了,没有人有义务免费解答你的问题。
learningman
2020-10-03 13:34:24 +08:00
看你发过"真正阅读和使用《提问的智慧》"
建议再去看一遍
凭你这态度,人家知道人家也懒得理你
kimown
2020-10-03 14:01:51 +08:00
tset 里面的代码能调试吗
Mindjet
2020-10-04 12:18:41 +08:00
@learningman #14

他没有义务免费回答我的问题,我也没有义务恭维蠢货。
因为这个回答不是我强求他给的,是他自己愿意的。

事实上他没有提供任何信息,也没有仔细的看上面的信息,他只提供了两个词儿,这两个词谁也知道。

所以我说这是很牛的装逼技巧,在任何地方都可以用,显得自己很牛似的。

它上面说的内容和如下的屁话本质上是完全一样的

「懂得都懂,不懂的说了也不懂,你也别问,利益牵扯太大,说了对你们没好处,我只能说水很深,网上的资料都删了,所以我只能说懂得都懂,不懂也没办法。」
Mindjet
2020-10-04 12:24:10 +08:00
@learningman #14

我在原帖中提供了足够的信息,贴出了文档中的具体段落和搜索引擎的结果,并且给出了自己的推测,已经做了很多的工作,所以不存在《提问的智慧》上描述的那种情况。

反而是这个人没有提供任何的信息,提问要有智慧,不代表对什么破烂回复都要捧臭脚。
Mindjet
2020-10-04 12:34:17 +08:00
@learningman

不好意思,我的用词是有点太不友好了,那些描述词不是针对你的,而是针对说废话的人。

如果有冒犯,我这里先道歉了,不会再 @你了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711884

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX