V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Mindjet
V2EX  ›  程序员

Google Test 中的 Macro 到底是什么?

  •  
  •   Mindjet · 2020-09-30 14:35:29 +08:00 · 2071 次点击
    这是一个创建于 1297 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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,而且语法也不太对。

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

    18 条回复    2020-10-04 12:34:17 +08:00
    ysc3839
        1
    ysc3839  
       2020-09-30 22:59:23 +08:00   ❤️ 1
    感觉是初学 C++?建议先把基础学好再去研究更复杂的东西。

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

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

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

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

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

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

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

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

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

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

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

    如果有冒犯,我这里先道歉了,不会再 @你了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2856 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 14:18 · PVG 22:18 · LAX 07:18 · JFK 10:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.