在c ++中void*volatile*的含义是什么?

Mat*_*gan 21 c++ pointers qualifiers volatile

我正在查看以下代码:

inline void* interlocked_read_acquire(void* volatile* x);
Run Code Online (Sandbox Code Playgroud)

并且我想知道为什么不仅仅volatile void*作为一个论点.一般来说,什么是语义或定义volatile*?我也假设您可以使用volatile*除void之外的任何其他类型的限定符.那是对的吗?

qua*_*dev 20

使用cdecl或顺时针螺旋规则来破译C风格的声明:

void* volatile* x
Run Code Online (Sandbox Code Playgroud)
  • 将x声明为指向void的volatile指针

这不同于:

volatile void* x
Run Code Online (Sandbox Code Playgroud)
  • 将x声明为volatile void的指针

  • quantdev,`volatile void`是否有意义?或者在演员阵容中? (2认同)
  • @vsoftco:这是有道理的 - 你可以添加但是`static_cast`期间不删除`volatile`(你还需要使用`const_cast`),因此保证了`挥发性无效*``是帮助volatile`防止意外清除访问指向对象时的波动性 (2认同)

Ton*_*roy 10

想知道为什么[ void* volatile*和]不仅仅是volatile void*......?

他们是不同的东西.

  • void* volatile*是指向volatile(void*)的指针(因此volatile void*可以在不进行转换的情况下取消引用和访问它,但只会在内存中为您提供某些尚未指定的内容的地址)

  • volatile void*是一个指向volatile的指针void(所以你必须强制转换为类似说volatile int*或volatile My_Class*在解除引用之前的类型)


M.M*_*M.M 7

void * ptr1;表示这ptr1是一个类型为的变量void *.此类型表示"通用指针" - 它指向某个内存位置,但不包含该位置内的类型信息.

void * volatile ptr2;意味着变量ptr2也是通用指针,但ptr2也是volatile.该关键字volatile称为cv-qualifier,它具有与之相同的语法规则const.

volatile变量的含义是,当其他一些代码说ptr2,编译器无法优化它; 它必须读取或写入存储的存储位置ptr2; 它必须考虑到某些外部进程也在读取或写入该位置的可能性.

最后,void * volatile *x是可以指出的ptr2.例如,我们可以void * volatile * x = &ptr2;.如果我们然后编写*x = NULL;例如,那么*x类型void * volatile具有与我们刚才看到的相同的含义ptr2.

如果您省略了限定符,编译器会抱怨,例如void * *y = &ptr2;.这是因为表达式*y将具有类型void *(非易失性),因此编译器可能会围绕它执行优化,但这是不正确的行为,因为ptr2不允许这些优化.(您可能会认识到"volatile-correctness"与const-correctness相同).