是否可以将_Atomic Type * 转换为void * 并返回?

t2a7ltrp  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(94)

一些库要求回调函数接受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);
}
egdjgwm8

egdjgwm81#

C 2018 6.3.2.3 1说:
指向void的指针可以转换为指向任何对象类型的指针,也可以转换为指向任何对象类型的指针。指向任何对象类型的指针都可以转换为指向void的指针,然后再转换回来;结果将与原始指针相等。
因此,仅仅将指针转换为void *并返回是没有问题的;该行为由C标准定义。转换的这种规范并不以任何方式限制它们的原子类型。
有关原子类型的属性适用于访问原子对象。(特别是,C 2018 6.7.2.4 4说“与原子类型相关联的属性仅对左值表达式有意义......”)只要void *不用于通过某些非原子类型访问对象,它对对象的使用没有影响。

相关问题