3个不稳定版本
0.2.1 | 2023年7月25日 |
---|---|
0.2.0 | 2022年9月28日 |
0.1.0 | 2022年8月3日 |
108 在 FFI 中
每月下载24次
54KB
996 行
printf-wrap
printf-wrap
是一个Rust crate,包含类型,帮助开发者编写使用printf(3)
样式格式字符串和可变参数的安全包装C函数。特别是,PrintfFmt<(T_1, T_2, ..., T_N)>
是围绕一个以null终止的字符串的包装器,保证它是用于类型为T_1
、T_2
、…、T_N
的N个参数的有效的格式字符串,当参数通过PrintfArgument::as_c_val()
方法映射时。
以下示例展示了使用两个参数调用printf
的安全包装,以及它的使用。
use printf_wrap::{PrintfFmt, PrintfArgument};
use libc::{c_int, printf};
/// Safe wrapper for calling printf with two value arguments.
pub fn printf_with_2_args<T, U>(fmt: PrintfFmt<(T, U)>, arg1: T, arg2: U) -> c_int
where
T: PrintfArgument,
U: PrintfArgument,
{
unsafe { printf(fmt.as_ptr(), arg1.as_c_val(), arg2.as_c_val()) }
}
const MY_FORMAT_STRING: PrintfFmt<(u32, i32)> =
PrintfFmt::new_or_panic("unsigned = %u, signed = %d\0");
fn main() {
printf_with_2_args(MY_FORMAT_STRING, 42, -7);
}
在示例中,MY_FORMAT_STRING
被确定在编译时是一个有效的格式字符串,用于(u32, i32)
类型的参数,没有任何运行时开销。通过一些宏魔法,可以轻松生成不同数量的后格式参数的包装器,而printf-wrap
则处理验证和将值转换为与C兼容的等效值的转换。
特性
libc
– 启用与 C 类型 size_t
、intmax_t
和 ptrdiff_t
相关的支持;需要 libc
包。
example
– 启用使用 printf-wrap
的示例,包括 C 标准库函数的一些包装;同样需要 libc
包。
许可证
此包受 MIT 许可证或 Apache License 2.0 许可证中的任一许可证许可,具体选择由您决定。MIT 许可证 或 Apache License 2.0 许可证。