首页 > 解决方案 > 如果 GCC 接受 C11 atomic_int 强制转换并且 clang 拒绝它们,这是正确的吗?

问题描述

假设我有以下 C11 程序:

#include <stdatomic.h>

int
main()
{
        int x = 0; // same behaviour if `atomic_int x`, surprisingly
        atomic_int y = (atomic_int) x;
}

如果我用gcc9 编译它,我不会收到任何错误。如果我用 Apple clang11 编译它,我会得到:

foo.c:7:17: error: used type 'atomic_int' (aka '_Atomic(int)') where arithmetic or
      pointer type is required
        atomic_int y = (atomic_int) x;

在各种平台上使用各种支持 C11 的Godbolt版本的 GCC、Clang 和其他编译器时,类似的问题比比皆是。无论是否--std=c11设置,都会发生这种情况。

快速阅读C11 标准草案(在 6.5.4 中)说“类型名称应指定原子、合格或不合格的标量类型,并且操作数应具有标量类型。”这表明强制转换是合法的 - I看不到任何会说的东西。

所以,我的问题是:clang这里有问题吗?其他编译器是否错误地接受了这个演员表?这是允许不同的clang地方吗?gcc

(顺便说一下,更广泛的背景是,我正在使用第三方程序生成 C 代码,其中包括从intmax_tto的转换atomic_int。此转换适用于gcc,这是该程序唯一支持的编译器,但是失败clang---因此,macOSgcc是 的别名clang。我正在尝试找出错误所在---clang拒绝有效代码、生成无效代码的程序或 ma​​cOS 假装编译器不是 is 的直接替代品gcc。)

标签: cgccclangc11

解决方案


推荐阅读