将常量数传递给size_t *参数时,gcc不会发出警告

时间:2014-09-22 15:09:33

标签: c gcc compiler-warnings compiler-flags

我的代码是这样的:

#define ZERO_CONSTANT 0
foo(size_t * p_size);

foo(ZERO_CONSTANT); //Doesn't warn

哪个gcc标志会调用foo(ZERO_CONSTANT)来警告?

3 个答案:

答案 0 :(得分:5)

没有编译标志可以帮助你。 C标准定义了文字0代表任何类型的空指针值。通常,您会看到0NULL(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开关可能启用此