我的代码是这样的:
#define ZERO_CONSTANT 0
foo(size_t * p_size);
foo(ZERO_CONSTANT); //Doesn't warn
哪个gcc标志将调用foo(ZERO_CONSTANT)
进行警告?
这里没有编译标志可以帮助您。C标准定义了文本0来代替任何类型的空指针值。经常会看到0
、NULL
和(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
开关可以启用此功能。