我有以下用例。C 中的结构体如下所示:
typedef struct _zend_internal_arg_info {
const char *name;
zend_type type;
zend_uchar pass_by_reference;
zend_bool is_variadic;
} zend_internal_arg_info;
通常该name字段包含一个函数名称。但是由于内部实现,这个字段也可以携带一个整数。在 C 端有一个宏在做这样的转换:
(const char*)(unsigned long int)(1)
我想要做的是在 Rust 端做同样的转换。我最终得到了以下代码:
fn create_null_argument(required_args: u8, return_reference: bool) -> ZendFunctionArgument {
let required_args_ref = Box::into_raw(Box::new(required_args as i8)) as *const i8;
ZendFunctionArgument {
arg: php_bindings::_zend_internal_arg_info {
name: required_args_ref,
type_: 0,
pass_by_reference: if return_reference { 1 } else { 0 },
is_variadic: 0,
},
}
}
这似乎适用于以下测试:
let arguments_ptr = ZendFunctionArguments::new(5, true).into_raw();
unsafe {
let arguments: Vec<php_bindings::_zend_internal_arg_info> = Vec::from_raw_parts(arguments_ptr as *mut _, 1, 1);
let required_args = *arguments[0].name;
assert_eq!(5, required_args);
}
不幸的是,在 PHP 端(执行代码时),每次执行时该值都是完全随机的。我想在这里问的是,与在 C 端 ( (const char*)(unsigned long int)(1))上的转换相比,我转换 i8 的方式是否正确?