在我的C99标准文件(实际上是2007年9月的自由委员会草案),附件I共同警告2中,它指出
(when) an implicit narrowing conversion is encountered, such as the assignment of a long int or a double to an int, or a pointer to void to a pointer to any type other than a character type (6.3)
是实施可能会产生警告的一些常见情况之一。
那么,c编译器是否可能会向int *p = malloc(sizeof(*p))
等代码发出警告?虽然在C代码中似乎更常见的是不投射malloc
s。
答案 0 :(得分:2)
来自C99 Annex I
,引用来自:
实施可能会在许多情况下产生警告,其中没有一个被指定为本国际标准的一部分。以下是一些较常见的情况。
这里的操作短语是“可能产生”。标准语言非常精确。如果他们想要坚持产生警告,他们就会使用短语“必须生成”或“必须生成”。
如果您的环境是访问无效对齐的数据类型(例如非字边界上的字)会导致灾难性故障(如总线错误),编译器可能会警告您这样的情况。一件事。
答案 1 :(得分:0)
不,在将void*
分配给另一个指针时不应该生成警告,因为这正是构造void*
的发明。这是一个通用指针,可以转换为任何其他数据指针。这绝不能与整数类型的缩小转换相媲美,在这种情况下,您可能会丢失信息。没有什么可以丢失。
此外,我发现C ++编译器切换到C ++ 11非常烦人,C ++编译器现在已经有了很大的缩小警告业务。至少在C中,非常精确地定义了对无符号整数类型的缩小转换,并且编译器不应该吠叫。