我的代码是这样的:
#define ZERO_CONSTANT 0
foo(size_t * p_size);
foo(ZERO_CONSTANT); //Doesn't warn
哪个gcc标志会调用foo(ZERO_CONSTANT)
来警告?
答案 0 :(得分:5)
没有编译标志可以帮助你。 C标准定义了文字0代表任何类型的空指针值。通常,您会看到0
,NULL
和(void*)0
。
(注意,这确实不暗示内存地址为0.因为它通常是未定义的行为为任何指针指定一个整数值type,0用作空指针的占位符文字。
答案 1 :(得分:3)
有一个新选项(自[可能] GCC 4.7.x以来可用) - -Wzero-as-null-pointer-constant。它符合您的期望,但仅对C ++有效...在C中,您提供的代码完全合法,因为NULL通常只是" 0"。
答案 2 :(得分:1)
正如已经提到的,将0
作为指针传递是完全有效的。如果您准备更改ZERO_CONSTANT
的定义:
#define ZERO_CONSTANT ((int)0)
然后使用clang生成警告:
warning: expression which evaluates to zero treated as a null pointer constant of type 'size_t *' (aka 'unsigned long *') [-Wnon-literal-null-conversion]
expanded from macro 'ZERO_CONSTANT'
#define ZERO_CONSTANT ((int)0)
不幸的是,在这种情况下,即使使用-Wextra
,gcc(4.8)仍然不会生成警告,尽管可能还有一个-W
开关可能启用此