static_assert c ++ 11的可用性

时间:2015-05-15 18:04:00

标签: c++ c++11 static-assert

我想在我工作的代码库中开始使用static_assert。不幸的是,并非所有C ++编译器都支持它们。在过去,我们使用了编译时断言宏,它对我尝试过的所有编译器都合理地工作(从SO中收集!),但是,它给出了一些稍微笨拙的编译错误消息。

我们支持大量编译器,包括那些不支持static_assert的编译器。此外,由于我们的产品是带有源代码的SDK,我们的客户可以使用他们希望的任何编译器重新编译它。因此,虽然我可以在我们使用的所有编译器中为它引入条件编译,但对于任何未知的编译器来说,它实际上是不可能的。编译器。

是否有一些编译时预定义的宏或其他工具是所有C ++编译器的标准用于确定static_assert的可用性,或者,您是否只需要知道'每个编译器都支持什么?

2 个答案:

答案 0 :(得分:4)

您可以考虑使用Boost's static assert

关于boost website

的说明
  

Boost库旨在广泛使用,并可用于广泛的应用程序。

出于这个原因,提升通常在使用语言功能时故意落后。您可以找到编译器兼容性列表here

如果你必须推出自己的实现,那么这里是Dr. Dobbs article。如果我没有弄错的话,Andrei Alexandrescu在他的Modern C++ Design中写到了这一点。

答案 1 :(得分:0)

在C ++ 14中,有feature test macros,它允许您概括使用C ++ 11/14/17功能。对于static_assert,宏为__cpp_static_assert

如果您的编译器本身并不支持这些(尚未),您可以根据编译器支持的内容的知识来定义它们,但它们将与任何标准化的“未知”前向兼容。编译器。

注意:这个答案来自我要求概括这个问题的一个问题,任何 C ++ 11特性(Availability of C++11 features)。我认为这个特定案例的动机存在一些混淆,并且给出的答案试图解决提供一个很好的静态断言,而不是实际问题(实际问题,他们实际上并没有)。