c/c++语言开发共享如何检查从C传递的函数指针是否为非NULL

示例代码如下

Rust部分:

#[no_mangle] pub extern fn call_c_function(value: i32, fun: fn(i32) -> i32) -> i32 { fun(value) } 

而C部分:

 int32_t call_c_function(int32_t value, int32_t (*fun)(int32_t)); int32_t triple(int32_t x) { return x*3; } int main(int argc, char *argv[]) { int32_t value = 3; int32_t result = call_c_function(value, triple); printf("%d tripled is %dn", value, result); call_c_function(0, NULL); // Crash here return EXIT_SUCCESS; } 

当然, call_c_function第二次调用将崩溃。 Rust编译器不会抱怨call_c_function不安全代码,因为从生锈的角度来看这段代码是安全的。 也不允许简单地写:

 if !fun.is_null() { fun(value) } 

因为fun类型是fn(i32) -> i32 (它不是指针)。

所以我的问题是,如何保护call_c_function免受NULL指针取消引用? 有没有办法检查从C传递的回调是否无效?

也许我必须改变call_c_function定义?

    您可以使用Option<...>来表示可为空的函数指针。 对于fn(...)类型的值具有NULL值是不正确的,因此对于这样的情况需要Option包装器。

    例如,

     #[no_mangle] pub extern fn call_c_function(value: i32, fun: Option i32>) -> i32 { if let Some(f) = fun { f(value) } } 

    但是,还有一点: fun是C函数,但fn(...)类型是Rust函数。 它们不是直接兼容的(例如它们的调用约定不同),当与C函数指针交互时,需要使用extern "C" fn(...) (也就是extern fn(...) )类型:

     #[no_mangle] pub extern fn call_c_function(value: i32, fun: Option i32>) -> i32 { if let Some(f) = fun { f(value) } } 

      以上就是c/c++开发分享如何检查从C传递的函数指针是否为非NULL相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560455.html

      (0)
      上一篇 2021年1月28日
      下一篇 2021年1月28日

      精彩推荐