演示程序
#include<stdio.h>
int main(){
static int ia[2];
static volatile _Atomic (int *) a = (int *) (&ia[1]);
if ((a += (1)) != (int *) ((int *) (&ia[1]) + (1)))
printf("1");
}
编译失败
<source>:5:9: error: invalid operands to binary expression ('volatile _Atomic(int *)' and 'int')
5 | if ((a += (1)) != (int *) ((int *) (&ia[1]) + (1)))
| ~ ^ ~~~
1 error generated.
Compiler returned: 1
Gcc 没问题!
https://godbolt.org/z/fMqzoe4b5
clang 是否支持 _Atomic 指针算法
这是合法的 C 代码。clang 拒绝它的事实是一个错误,于 2015 年报告,至今仍未修复。
++a
作为一种解决方法,您可以在这种特殊情况下使用,即您要加 1,或者对于更一般的加法,您可以使用atomic_fetch_add
对指针起作用的。但请注意,这atomic_fetch_add
将返回旧值而不是新值,因此要获得 的等价值a += 5
,您必须编写类似 的内容atomic_fetch_add(&a, 5)+5
。