请注意,这不是How write a unit test for verifying compiling error?的副本,因为我不关心测试外部库或编译器本身的正确性。
在C ++中,特别是在处理模板时,采用阻止某些特定代码编译的技术。由于这些问题可能会变得复杂,确保特定代码片段确实会产生编译器错误的最佳方法是什么?
由于测试甚至不应该编译,你不能依赖boost-test之类的东西,所以我想它应该集成在构建系统中?这些问题通常如何处理?
答案 0 :(得分:11)
以类似的方式编写编译器测试。您将在某些脚本语言(shell,perl,tcl等)中使用一些测试代码,这些代码将在给定的代码片段上运行编译器,并检查正确的代码片段是否已编译而正确的代码片段是否已编译。
答案 1 :(得分:4)
您可能需要查看metatest - Unit testing framework for C++ template metaprograms(author's original post to the Boost mailing list)。得到它here。
与图书馆here相关的出版物。
答案 2 :(得分:3)
您必须依赖外部框架来运行一组编译测试,例如: makefile或hudson作业并检查编译器输出或编译器工件。如果编译失败,则编译时不应存在该文件的目标文件。我猜你可以为哈德森写一个插件来做这个或者是一个简单的批处理脚本,它运行一个makefile来编译所有应该失败或成功的测试文件并相应地标记成功或失败。
在最简单的情况下,您只需检查“.o”文件是否存在以查看测试是否成功,在更复杂的情况下,您可能需要查看编译器输出并验证产生的错误是否同意与您期望的错误。这取决于您使用的编译器。
更深层次可能意味着编写一个编译器扩展来做到这一点(LLVM可能能够处理你所要求的)
答案 3 :(得分:2)
使用val displayPropertyPrice = Transformations.map(selectedProperty) {
application.applicationContext.getString(
when (it.isRental) {
true -> R.string.display_price_monthly_rental
false -> R.string.display_price
}, it.price)
}
negative feature
表达式测试c++20
,因此可以保证某些构造将无法编译:
下面,我检查静态断言中函数requires
的重载是否存在,当与测试框架一起使用时,应在其中一个运行时测试中使用布尔值,以免阻止其他测试编译:
func
该代码在Compiler Explorer中可用:https://godbolt.org/z/direWo