没有强制转换的整数指针

当我调用一个需要指针的函数,并传入一个值时,我得到了这个警告,我喜欢这样。

但是当值恰好是字面值’0’时,我没有得到警告。 我认为这是因为C认为它是空指针,而不是值。 有没有办法仍然得到0字面的警告,因为我已经有一些错误因为它。

GCC支持函数参数的nonnull属性 ,可以执行您想要的操作(只要启用-Wnonnull警告选项):

 void* foo( int* cannot_be_null) __attribute((nonnull (1))) ; int main(int argc, char *argv[]) { int x; foo(&x); foo(0); // line 13 - generates a -Wnonnull warning return 0; } 

当使用gcc -c -Wnonnull test.c编译时,我得到:

 test.c: In function 'main': test.c:13:5: warning: null argument where non-null required (argument 1) [-Wnonnull] 

您可以使用-Werror=nonnull强制执行此错误。

请注意,仅当使用空指针文字(另一个名称为0 )时才会抛出此警告 – 以下代码不会触发警告:

 int* p = NULL; foo(p); 

遗憾的是,没有使用原始C编译器。 您应该尝试使用lint工具作为夹板,这可能对您有所帮助(但我不确定)。

我认为转换为null可能对编译器来说是相当固有的 – 但是应该很容易静态地检查这些情况,因为它们是相当独特的。

如果您希望传递null而不是(int)0,请使用显式NULL枚举或定义,然后匹配模式YourFunction(0); (允许空格)绝对无效。 如果你想要低技术,Grep可以很容易地使用。 Fabien建议,各种棉绒工具都可以做到这一点。

我总是试着记住编码的时候,如果可以的话,让错误的东西看起来尽可能错误,这样你就可以更容易地检测到它们。

这个问题与问题类似。 Should I use symbolic names like TRUE and FALSE for Boolean constants, or plain 1 and 0?

C程序员必须明白NULL和0在指针上下文中是可以互换的,并且uncast 0是完全可以接受的。 任何使用NULL(而不是0)都应该被认为是一个温和的提示,即涉及指针; 程序员不应该依赖它(无论是为了他们自己的理解还是编译器)来区分指针0和整数0。

只有在指针上下文中,NULL和0才是等价的。 当需要另一种类型0时,不应该使用NULL,即使它可能有效,因为这样做会发送错误的样式消息。 (此外,ANSI允许NULL的定义为((void *)0),这在非指针上下文中根本不起作用。)特别是,当需要ASCII空字符(NUL)时,不要使用NULL。 提供您自己的定义

 #define NUL '\0' 

如果你必须。

此信息来自此链接

有没有办法仍然得到0字面的警告

我不知道一个,不管怎么说你不想要那个。 当分配给指针时,常量数值0被隐式地视为NULL而不将其转换为指针类型。