当我使用螺旋规则时,我在 10 个螺旋步骤内对下面的线感到困惑。有更快的方法吗?
// compiles in VC++ 2010
const void * const ** const volatile *** const **** _foo_;
例如ptr 是一个指向指针的指针,它们都是指向指针的指针,它们都是 const void 但其中 2 个是 volatile void const
const void * const ** const volatile *** const **** p
将 p 声明为指向指针的指针 指向 const 的指针 指向指向 const 的指针的指针 指向 const 的指针 指向 const 的指针 指向 const void 的指针
这很容易用螺旋规则!
:-P
使用指针和引用声明,您只需从右到左阅读:
ptr
是指向指针的指针,指向指针的指针,指向指针的指针,const
指向指针的指针,指向指针的const volatile
指针,指向未知类型对象的const
指针。const
如果您遵循在第一个类型说明符(ie )之后而不是在它之前(ie)放置任何const
或volatile
限定符的准则,那么您可以从右到左一致地阅读;否则,当你到达左手端时,你有时会打嗝。void const *
const void *
螺旋“规则”有时对涉及数组或函数的声明很有用,其中声明的名称不是声明中的最后一件事。在这种情况下,名称后面没有任何内容,它退化为从右到左阅读。
那是因为没有螺旋规则。基本上,您首先在右侧处理操作数,然后在左侧处理,在两种情况下都向外处理,并尊重括号。并且 cv 限定符通常限定它们左边的内容。由于这个声明在右边没有操作数,它只是从右到左: 指向指针的指针 指向 const 的指针 指向 const 的指针 指向 const 的指针 volatile 指向 const 的指针 指向 (const) void 的指针。最后一个 const 是因为最后一个 const 左边没有任何东西,所以我们必须将声明视为void const
,而不是const void
. 除此之外,如果您忘记了被误导的螺旋,那么声明应该不会造成任何问题。