static_assert c++11 的可用性

Availability of static_assert c++11

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

我们支持大量编译器,包括不支持 static_assert 的编译器。此外,由于我们的产品是带有源代码的 SDK,因此我们的客户可以使用他们希望的任何编译器重新编译它。因此,虽然我可以在我们使用的所有编译器中为其引入条件编译,但我真的不可能为任何 'unknown' 编译器执行此操作。

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

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

关于 boost website 的注释:

Boost libraries are intended to be widely useful, and usable across a broad spectrum of applications.

正因如此,boost在语言特性的使用上通常会故意滞后。您可以找到编译器兼容性列表 here.


如果您必须推出自己的实现,那么这里是 Dr. Dobbs article. If I'm not mistaken, Andrei Alexandrescu wrote about this in his Modern C++ Design

在C++14中,有feature test macros,可以让你泛化使用C++11/14/17的特性。对于 static_assert,宏是 __cpp_static_assert

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

注意:这个答案是从我提出的一个问题中获得的,该问题将这个问题概括为 any C++11 特性 ()。我认为这个特殊案例的动机存在一些混淆,给出的答案试图解决提供一个很好的静态断言,而不是被问到的实际问题(他们实际上没有这样做)。