使用cmake:我如何编写一个测试来验证类是抽象的?
With cmake: how could I write a test to verify that a class is abstract?
我想知道我是否可以写一个.cpp文件,试图实例化一个抽象类:
// file: test_ensure_A_is_abstract.cpp
class A { void foo() = 0; };
int main() { new A; }
// a simple shell script would look like this, but that is missing all the
// options cmake normally generates (-I, -g, -c, -o, ...)
if g++ test_ensure_A_is_abstract.cpp; then exit 1; else exit 0; fi
,然后让cmake尝试编译它。我在这里的观点是,我想证明类是抽象的,并且仍然是抽象的,所以不能实例化它。
我知道如何创建一个有效的目标,但我想知道是否有一种方法来运行cmake的目标已知是无效的?有人做过吗?
更新:
根据steve的回答和下面的评论,我写了我自己的模块来做这项工作,并确保类是真正抽象的(而不是指望任何编译器失败作为抽象类的指示)。所以我们必须有一个与特定错误匹配的错误信息。我支持其中的4个,2个明确地使类抽象(至少一个函数是纯虚的),另外2个将受保护和私有构造函数视为一种抽象类(就像抽象类一样,你不能做一个新的<类名>。类名>
你可以在Snap中找到那个模块!c++ git here:
https://sourceforge.net/p/snapcpp/code/ci/master/tree/snapCMakeModules/Modules/命名为CheckCXXAbstractClass.cmake.
http://www.cmake.org/cmake/help/v3.0/command/try_compile.html
http://www.cmake.org/cmake/help/v3.0/module/CheckCXXSourceCompiles.htmlcheck_cxx_source_compiles(
"class A { void foo() = 0; };nint main() { new A; }"
BUILT_ABSTRACT
)
if (BUILT_ABSTRACT)
message(FATAL_ERROR "A can be instantiated, but should be abstract.")
endif()
如果适当地设置CMAKE_REQUIRED_INCLUDES
变量,则可以使用#include "A"
相关文章:
- C++多态性:如何测试一个类是否派生自另一个基类
- 单元测试一个变量的true和false
- 测试一个数字是否具有小数值,而没有任何库
- 有没有一种方法可以测试一个输入是否是C++中的数字
- 如何使用switch语句(C++)测试一个数字是素数还是可被7整除
- 我如何测试一个调用是在谷歌测试延迟后使用嘲讽框架进行的
- 谷歌模拟测试一个类的真实行为
- 测试一个操作在Qt中花费多少时间的最简单方法
- 使用不同的函数(C++)测试一个数字是否是回文
- 测试一个图是否是树
- 如何(单元)测试一个函数是否无锁
- 如何测试一个序列是否符合给定模式中的另一个序列
- 用Qt测试一个本地连接
- 测试一个简单的链表,但它坚持向后迭代
- 如何测试一个std::线程是否从
- 如何在c++和Google测试中测试一个虚纯函数
- 测试一个方法的私有成员是否依赖于时钟时间
- 测试一个向量的所有元素是否相等
- 基准测试一个纯C++函数
- 为什么这个特性类不起作用,来测试一个类是否有某个typedef