当涉及到在指针转换常量-正确性的规则,C语言支持从T *
类型的隐式转换到用于非数组数据类型T
键入const T *
。这是C语言支持的唯一“常量保护”隐式转换。
换句话说,如果T
和U
是相同非阵列类型的转换从T *
const U *
到被支撑。如果T
与U
有某些不同,则隐式转换无效(即使T
和U
之间的差异仅仅是一些额外的const限定符)。
简而言之,您只能在最内层*
之后添加const
。您不得在任何更深层次的间接添加const
。这就是为什么您的p5
和cube
行不能编译。
int *p = 0;
const int *cp = p; // OK: `const` is added after the first `*`
int **pp = 0;
const int *const *cpp = pp; // Error: a "deep" `const` added
有时候,在你的代码,你可能需要规避这些限制,并在间接的更深层次添加一些额外的const
。在这种情况下,你别无选择,只能使用明确的转换。
int **pp = 0;
const int *const *cpp = (const int *const *) pp;
P.S. C++放宽了这些限制中的一部分,创建了更合乎逻辑的常量正确性规则系统。唉C从来没有朝这个方向迈出任何一步。
来源
2017-02-11 18:07:12
AnT
“如何添加附加保护的规则”取决于您尝试实现的保护措施。只有你知道你需要保护什么以及不受保护的内容。 – AnT