static_assert C 的可用性11

Availability of static_assert c++11

本文关键字:可用性 assert static      更新时间:2023-10-16

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

我们支持大量编译器,包括不支持static_assert的编译器。另外,由于我们的产品是具有源代码的SDK,我们的客户可以将其与他们希望的任何编译器重新编译。因此,虽然我可以在我们使用的所有编译器中为此介绍条件编译,但我真的不可能为任何"未知"编译器进行操作。

是否有一些编译时预定义的宏或其他设施,这些宏或其他C 编译器的标准化设施可以确定static_assert的可用性,或者您只是只需要"知道"每个编译器支持什么?

您可以考虑使用Boost的静态断言。

提示网站上的注意:

提升库旨在广泛有用,并且可在广泛的应用程序中使用。

因此,在使用语言功能时,Boost通常故意落后于落后。您可以在此处找到编译器兼容性列表。


如果您必须滚动自己的实施,这是Dobbs博士的文章。如果我没记错的话,Andrei Alexandrescu在他的现代C 设计中写了这一点。

在C 14中,有特征测试宏,可允许您推广使用C 11/14/17功能。对于static_assert,宏为__cpp_static_assert

如果您的编译器固有地支持这些编译器,则可以根据对编译器的支持知识来定义它们,但它们将与任何标准化的"未知"编译器兼容。

注意:这个答案是从我问的一个问题中获得的,该问题将这个答案概括为 c 11功能(C 11功能的可用性)。我认为这种特殊情况的动机有些困惑,而所给出的答案试图提供一个很好的静态断言,这比询问的实际问题还多(他们实际上没有这样做)。