如何测试某些代码无法在C ++中编译?

时间:2012-01-25 12:54:45

标签: c++ unit-testing templates testing compilation

  

可能重复:
  Unit test compile-time error

我想知道是否有可能编写一种单元测试来验证给定代码编译。

例如,我有一个模板类:

#include <boost/static_assert.hpp>
#include <boost/type_traits/is_base_of.hpp>

struct bar_base {};

template <typename T>
class foo 
{
    BOOST_STATIC_ASSERT(::boost::is_base_of<T, bar_base>::value);
};

因此,测试应该成功:

struct bar_derived : bar_base {};
foo<bar_derived> f;

但应该失败:

struct bar_other {};
foo<bar_other> f;

任何想法如何实现这样的行为? (现在,我必须取消注释失败的代码并手动验证是否存在编译错误 - 我想避免这种情况)

2 个答案:

答案 0 :(得分:3)

Boost确实有编译测试,他们通过简单地将每个测试放入一个源文件然后尝试编译其中的每一个来完成此操作。 Boost.Build支持special commands to run tests,其中包括测试文件是否编译。

答案 1 :(得分:0)

它的要点是你将运行一个正常的“应该失败”单元测试,但是你不是运行你编译的程序,而是运行一个应该失败的例子的编译器。

例如,在gtest上,这将是编译器的“死亡测试”。 http://code.google.com/p/googletest/wiki/V1_6_AdvancedGuide#Death_Tests