c-gcc在向size_t*参数传递常量时不发出警告



我的代码是这样的:

#define ZERO_CONSTANT 0
foo(size_t * p_size);
foo(ZERO_CONSTANT); //Doesn't warn

哪个gcc标志将调用foo(ZERO_CONSTANT)进行警告?

这里没有编译标志可以帮助您。C标准定义了文本0来代替任何类型的空指针值。经常会看到0NULL(void*)0

(请注意,这并不意味着内存地址为0。因为通常将整数值分配给任何指针类型都是未定义的行为,所以0被用作空指针的占位符文字)。

有一个新选项(可能是GCC 4.7.x之后提供的)--Wzero作为空指针常量。它可以满足您的期望,但仅对C++有效。。。在C中,您提供的代码是完全合法的,因为NULL通常只是"0"。

如前所述,将0作为指针传递是完全有效的。如果您准备更改ZERO_CONSTANT:的定义,则可以使用某些编译器生成警告

#define ZERO_CONSTANT ((int)0)

然后生成一个带有叮当声的警告:

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开关可以启用此功能。

最新更新