【发布时间】:2019-01-17 22:36:35
【问题描述】:
struct istruct {
const int i;
};
const int i = 1;
struct istruct is = {1};
void *voidp_i = &i; // warning: discards 'const' qualifier
void *voidp_is = &is; // no warning
出于所有意图和目的,struct istruct 似乎被解释为 const 限定类型。如果这是真的,那么最后一行也发出警告是否有意义?
【问题讨论】:
-
我认为是因为
is没有const限定符。结构成员是但结构本身不是。 -
但
&is不是常数,(&is)->i是。如果有两个成员:一个是 const,另一个不是? -
由于您已将
const放入类型定义中,当您将指针从void转换回时,该字段仍将是const-qualified,除非您将指针转换为完全不同的类型,并开始参与可能存在的所有潜在相关问题。 -
请允许我按原样分享我的一些经验(即没有标准引号):对于至少一些编译器(主要嵌入在我的环境中),不要期望 const 限定符在结构类型。只有结构类型的变量定义的 const 限定符是相关的。在嵌入式环境中,const 变量可以链接到物理上不可写的内存以实现 const 效果。部分变量不能链接到不同的内存中。至少我是这样对自己解释的。欢迎评论赐教。