一些库要求回调函数接受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);
}
1条答案
按热度按时间egdjgwm81#
C 2018 6.3.2.3 1说:
指向
void
的指针可以转换为指向任何对象类型的指针,也可以转换为指向任何对象类型的指针。指向任何对象类型的指针都可以转换为指向void
的指针,然后再转换回来;结果将与原始指针相等。因此,仅仅将指针转换为
void *
并返回是没有问题的;该行为由C标准定义。转换的这种规范并不以任何方式限制它们的原子类型。有关原子类型的属性适用于访问原子对象。(特别是,C 2018 6.7.2.4 4说“与原子类型相关联的属性仅对左值表达式有意义......”)只要
void *
不用于通过某些非原子类型访问对象,它对对象的使用没有影响。