某些库需要回调函数采用
void *
(而不是 _Atomic void *
)。是否可以将 _Atomic Type *
投射到 void *
然后再投射回来使用它?就像下面的代码:
#include <stdio.h>
int Call(int(*f)(void*), void *arg){
return f(arg);
}
int Use(void *arg){
return *(_Atomic int *)arg;
}
_Atomic int g_x;
int main(int argc, const char **argv){
g_x = argc;
int y = Call(Use, (void*)&g_x);
printf("%d\n",y);
}
C 2018 6.3.2.3 1 说:
指向
的指针可以与指向任何对象类型的指针相互转换。指向任何对象类型的指针都可以转换为指向void
的指针,然后再转换回来;结果应等于原始指针。void
因此,仅将指针转换为
void *
并返回是没有问题的;该行为由 C 标准定义。此转换规范不会以任何方式限制原子类型。
有关原子类型的属性适用于访问原子对象。 (特别是,C 2018 6.7.2.4 4 说“与原子类型关联的属性仅对左值表达式有意义......”)只要
void *
不用于通过某些非原子类型访问对象,它对对象的使用没有影响。