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

问题描述 投票:0回答:1

某些库需要回调函数采用

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 atomic void-pointers
1个回答
0
投票

C 2018 6.3.2.3 1 说:

指向

void
的指针可以与指向任何对象类型的指针相互转换。指向任何对象类型的指针都可以转换为指向
void
的指针,然后再转换回来;结果应等于原始指针。

因此,仅将指针转换为

void *
并返回是没有问题的;该行为由 C 标准定义。此转换规范不会以任何方式限制原子类型。

有关原子类型的属性适用于访问原子对象。 (特别是,C 2018 6.7.2.4 4 说“与原子类型关联的属性仅对左值表达式有意义......”)只要

void *
不用于通过某些非原子类型访问对象,它对对象的使用没有影响。

© www.soinside.com 2019 - 2024. All rights reserved.