小编pa-*_*ims的帖子

如何测试 _Static_assert 是否已定义?

_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)

c static-assert c-preprocessor

1
推荐指数
1
解决办法
97
查看次数

标签 统计

c ×1

c-preprocessor ×1

static-assert ×1