_Static_assert内置于某些 C 编译器(例如 gcc 和 clang)中,但可能并非所有 C 编译器都包含它。我想在使用该_Static_assert功能的同时尽可能保持我的代码跨平台。我认为最好的方法是测试
#ifdef _Static_assert
_Static_assert(0, "Test");
#endif
Run Code Online (Sandbox Code Playgroud)
但这似乎行不通。它编译,但它没有检测到_Static_assert已定义。然后我想我可以测试编译器是否是 GCC,但我读到__GNUC__定义并不一定证明使用的编译器是 GCC。这也没有检测_Static_assert到我可能不知道的其他编译器。所以我的问题是,检测编译器是否支持_Static_assert预处理器的最佳方法是什么?
编辑:这是我想出的适合我的目的的解决方案。感谢下面的@KamilCuk 提供帮助我的链接。
// Check that we can use built-in _Static_assert
#if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 201112L
#define WE_HAVE_STATIC_ASSERT 1
#endif
#if WE_HAVE_STATIC_ASSERT
_Static_assert(0, "Test");
#endif
Run Code Online (Sandbox Code Playgroud)
这段代码在 gcc 和 clang 上都适用于我:https : //godbolt.org/z/svaYjWj4j
最终编辑(我认为):这为我关于如何检测是否_Static_assert可用的原始问题提供了答案。它还提供了一个回退选项,可以在我测试的大多数编译器中产生相对有用的错误。
这是测试代码的链接:https : //godbolt.org/z/TYEj7Tezd
// Check if we can use built-in …Run Code Online (Sandbox Code Playgroud)