C99警告:将void指针分配给非void指针?

4
在我的C99标准文件中(实际上是2007年9月的免费委员会草案),公共警告2附录I中指出:
当出现隐式缩小转换时,例如将长整型或双精度浮点型赋值给整数,或将指针转换为除字符类型以外的任何类型的指针时(6.3),这是实现可能生成警告的常见情况之一。
那么,一个C编译器是否应该会对int *p = malloc(sizeof(*p))这样的代码发出警告呢?虽然在C代码中不对malloc进行强制转换似乎更常见。

“May generate” 的意思是如果编译器知道不会丢失信息,它就不会发出警告?例如,在分段架构上将 malloc 的结果分配给不适当的近指针,就会收到一个警告。 - Kerrek SB
2个回答

2
C99 Annex I来看,该引用内容如下:

实现可以在许多情况下产生警告,对于这些情况没有规定为国际标准的一部分。以下是一些较常见的情况。

在这里,“may generate”是关键短语。标准语言非常精确,如果他们想要强调必须生成警告,则会使用“shall generate”或“must generate”短语。
在您的开发环境中,如果访问无效对齐数据类型(例如非字边界上的字)可能导致灾难性失败(例如总线错误),编译器可能会警告您。

0

不会的,当将 void * 分配给另一个指针时,不应该生成警告,因为这正是构造 void * 发明的原因。这是一个通用指针,可以转换为任何其他数据指针。这绝不可与整数类型的缩小转换相比较,在后者中可能会丢失信息。这里没有任何东西被丢失。

此外,我发现在C ++编译器切换到C ++ 11后,会出现缩小警告的问题非常令人讨厌。至少在C语言中,将缩小转换为无符号整数类型是非常准确定义的,编译器不应该报错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接