【问题标题】:Why does this discarding of const-qualification not result in any warning?为什么放弃 const 限定不会导致任何警告?
【发布时间】: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 效果。部分变量不能链接到不同的内存中。至少我是这样对自己解释的。欢迎评论赐教。
  • 还有:matt.sh/sytycc

标签: c constants


【解决方案1】:
void *voidp_is = &is;

这里&is 是struct istruct * 类型并且没有const 限定符,只有成员i 是const。请注意,写入结构的const 成员(例如((struct istruct *) voidp_is)->i=0;)将导致未定义的行为,因为您正在修改const int。 (C2011, 6.7.3/6)

void *voidp_i = &i;

在此示例中,&i 的类型为 int const *,const 限定符在初始化时被丢弃。

【讨论】:

  • 我看到is 定义为struct ìstruct 类型的变量而不是struct istruct*。你能详细说明一下吗?
  • 是的,但 &is 因此属于 struct istruct * 类型。
  • 啊,我明白了你指的是 voidp_is 的初始化值。我错过了。也许你想为像我这样的部分失明的人说句... ;-)
  • @Yunnosch 我添加了定义。我认为现在我所指的内容更清楚了。
  • 谢谢。您想通过讨论尝试写信给((struct istruct*) voidp_is)->i=0; 时发生的情况来改进吗?我会感兴趣,因为我的经验让我即使在那时也不会期待丢弃警告。
猜你喜欢
  • 2016-09-24
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 2014-01-19
相关资源
最近更新 更多