【发布时间】:2014-04-24 15:33:43
【问题描述】:
获取这个简短的 C 文件 nulltest.c,它会打印“Hey”:
#include <stddef.h>
#include <stdio.h>
int main() {
char c = NULL;
c = 'e';
printf("H%cy\n", c);
return 0;
}
我的理解是,在 C 语言中,NULLshould expand to a null pointer constant 会使 char c = NULL 成为指向整数的指针的隐式转换。但是,在 gcc 4.8 中编译时:
$ gcc --version
gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
$ gcc -Wall -Wconversion nulltest.c
$
我没有收到任何警告。
另一方面,先前版本的 gcc 和 clang 都在同一代码上发出警告:
$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
$ gcc nulltest.c
nulltest.c: In function ‘main’:
nulltest.c:5: warning: initialization makes integer from pointer without a cast
在 Mac OS X 10.9 上:
$ clang --version
Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)
$ clang nulltest.c
nulltest.c:5:8: warning: incompatible pointer to integer conversion initializing
'char' with an expression of type 'void *' [-Wint-conversion]
char c = NULL;
^ ~~~~
对于 gcc 4.4 和 4.8,我相信 relevant line in the relevant copy of stddef.h 读取为 #define NULL ((void *)0)。
为什么一个版本的 gcc 会发出警告而不是另一个?
【问题讨论】:
-
只是我对此的评论:GCC 显然不好,如果不是不合适的话,我会使用不同的词。
-
gcc -E nulltest.c | tail -n 6产生什么? -
“NULL 应该扩展为一个空指针常量”:非常正确。但是,如果你看一下标准中“空指针常量”的定义,你会发现空指针常量并不保证有指针类型。
-
gcc (Debian 4.7.2-5) 4.7.2 确实发出警告。
标签: c gcc casting null gcc-warning