【问题标题】:Checking typedef defined function pointer for null检查 typedef 定义的函数指针是否为空
【发布时间】:2016-03-12 22:01:31
【问题描述】:

接着this excellent SO answer on function pointers;给定一个用 C 定义的函数指针,如:

typedef void (*Callback)(int argument);
Callback my_callback = 0;

如何检查回调函数指针是否被赋值为非空值?

my_callback == 0&my_callback == 0?

【问题讨论】:

  • 您确定您了解&my_callback 的作用吗?
  • @Leushenko 不,一点也不!因此我的问题。我很困惑,因为使用 my_callback(my_argument) 似乎被隐式取消引用。
  • 你应该知道0和NULL不一定是一回事。编译器可能会执行所需的隐式转换,但是在初始化函数指针my_callback 时,发布的代码应该使用 NULL,而不是 0
  • 其实差别挺大的,0是数值,int类型。虽然 NULL 是 void* 类型,但编译器确实关心分配给指针的值的类型。在大多数情况下,编译器会执行必要的隐式转换。这并不意味着在编译器必须通过隐式转换纠正编码器错误(如果可以)的情况下编写代码是“可以的”。

标签: c pointers null function-pointers


【解决方案1】:

你应该检查my_callback == 0,因为它是一个函数指针。


此外,您正在考虑的第二个选项:

&my_callback == 0

地址,你甚至会被编译器警告:

warning: the comparison will always evaluate as ‘false’ for the address of ‘my_callback’ will never be NULL [-Waddress]
  if(&my_callback == 0)
                  ^

Is NULL always zero in C?

【讨论】:

  • 嗯,几乎是正确的答案,除了 0 和 NULL 不一定是同一件事。
【解决方案2】:

记住变量的类型是函数指针,所以你可以直接和NULL或者0比较。

这可能取决于您的编码约定和样式偏好,但我倾向于将指针用作布尔值本身:

if (my_callback) {
    // Do the thing
}

【讨论】:

  • 我不确定,因为my_callback 在我使用它时会自动取消引用:my_callback(my_argument)。我认为这种自动取消引用也可能适用于其他用途。
  • @ARF - 你是绝对正确的。 my_callback 是一个指针,所以 my_callback(my_argument) 正在取消引用该指针并执行函数
  • @ARF 只有当您像使用(..) 的函数一样调用它时,它才会自动取消引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 2015-07-15
  • 2011-05-16
  • 1970-01-01
相关资源
最近更新 更多