gpt4 book ai didi

c - 在 FreeBSD 上使用 -std=c99 获取 "_Static_assert is a C11-specific feature"

转载 作者:行者123 更新时间:2023-12-05 05:48:13 27 4
gpt4 key购买 nike

减少到最简单的可复制大小:

#include <assert.h>

#ifdef static_assert
static_assert(1 == 1, "oops!");
#endif

-std=c99 -pedantic 编译给出 warning: _Static_assert is a C11-specific feature [-Wc11-extensions]在 FreeBSD 上(在 11.2 和 12.3 上测试,分别使用 clang 6.0 和 10.0)。

我在使用 gcc 或 clang(各种版本)的 Linux 上没有遇到这个问题(当指定 static_assert 时未定义 std=c99)。

#ifdef guard 专门用于避免在不可用时尝试使用 C11 功能的问题!

(正如我所说,这是最小的可重现大小。实际上我想定义我自己的 static_assert 如果没有一个可用的,并让源代码在尽可能多的系统上干净地编译。)

在 FreeBSD 上,assert.h定义 static_assert如果__ISO_C_VISIBLE >= 2011 . __ISO_C_VISIBLEsys/cdefs.h 中默认设置.

在 Linux 上,assert.h定义 static_assert如果__USE_ISOC11已定义,并且 __USE_ISOC11features.h 定义如果_ISOC11_SOURCE已定义。

我有点惊讶__STDC_VERSION__未在 FreeBSD 上检查(Linux 版本将定义 static_assert 如果 __STDC_VERSION__ >= 201112L )。但在这两个方面我都有些惊讶 __STDC_VERSION__ 的较低值未用于限制该功能。

我可以通过一些特定于 FreeBSD 的检查来解决这个问题,但是 FreeBSD 这样做是“错误的”还是 Linux 这样做是“错误的”?

最佳答案

I can work around this with some FreeBSD-specific checks, but isFreeBSD doing it "wrong" or is Linux doing it "wrong"?

FreeBSD 的默认编译器是 clang,Linux 的默认编译器是 gcc。在 FreeBSD 的情况下,clang 用于基本系统并使用由 FreeBSD 编写的自定义制作的 Makefile。

我还在 macOS 上进行了测试,macOS 是 FreeBSD 派生的操作系统。它按预期工作。

FreeBSD的clang好像有偏差。我不知道这是错误还是有意需要正确构建基本系统。

所以严格回答你的问题,FreeBSD 在这里做错了。

FreeBSD-13.1 上的 Clang 13.0.0:

% cc -std=c99 -pedantic -o m m.c
m.c:4:1: warning: '_Static_assert' is a C11 extension [-Wc11-extensions]

关于c - 在 FreeBSD 上使用 -std=c99 获取 "_Static_assert is a C11-specific feature",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70848614/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com