c - 没有转换的整数指针

标签 c pointers gcc casting c99

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

但是当该值恰好是文字“0”时,我没有收到警告。我认为这是因为 C 认为它是空指针,而不是值。有什么方法仍然可以得到 0 字面量的警告,因为我已经有一些错误了。

最佳答案

GCC 支持 nonnull attribute on function parameters可以做你想做的事(只要启用了 -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 - 没有转换的整数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14610575/

相关文章:

c - 从 fgets() 输入中删除尾随换行符

c - 在 ANSI C 中,如何在不使用日期变量的情况下处理 > 或 < 跨越午夜的时间表达式

根据另一列中的值有条件地计算一列的递归

c - 如何删除此警告 : second parameter of ‘va_start’ not last named argument?

c++ - Object Mat(args); 之间的区别 - 内存分配明智 -和 Object *Mat = new Mat(args);在 C++ 中?

Char 双向链表

c++ - 指向 vector 的共享指针

c++ - GCC 无法编译 : '* does not name a type'

c++ - 这个 stdout 重定向是如何工作的?

c++ - g++ 在基类中找不到重载函数