Google测试自动注册是否会避免静态初始化命令失败?

时间:2017-07-10 17:56:30

标签: c++ c++11 googletest static-order-fiasco

在c ++ 11中使用Google Test,如果测试是在不同的编译单元中定义的,那么自动注册机制是否容易受到静态初始化命令惨败的影响?

如果没有,为什么不呢?

编辑添加:

具体来说:据我所知,该标准允许在进入main()之后在其他编译单元中初始化测试类的静态成员。

UnitTest::GetInstance()方法保证在首次访问时创建UnitTest注册表。但是,在注册任何测试之前,什么阻止第一次访问是从Run()调用主main()方法?

也许关键是它们是静态类成员,而不是静态自由变量?

2 个答案:

答案 0 :(得分:1)

每个TEST宏扩展为带有静态字段的测试类,该字段将通过调用MakeAndRegisterTestInfo()进行初始化,该调用将访问UnitTest::GetInstance()中函数范围的静态变量中的测试注册表。此变量将在首次使用时初始化,并且测试注册表将正确地逐个注册测试,即使未定义测试注册的顺序,因为它们在初始化相应的静态字段时已注册。

答案 1 :(得分:0)

根据this answer to an equivalent question,答案是:

是的,Google Test的自动注册机制容易受到静态初始化订单惨败的影响。

如果测试是在其他编译单元中定义的,那么在调用RUN_ALL_TESTS()之前是否注册它们取决于编译器特定的行为。