ITPub博客

首页 > 数据库 > 数据库开发技术 > Rust 与 C/C++ 宏浅谈

Rust 与 C/C++ 宏浅谈

原创 数据库开发技术 作者:Rust嵌入式 时间:2024-05-09 21:05:00 0 删除 编辑

本质上,宏是让编译器为您编写代码的工具。可以把宏当成一个公式,编译器基于这个公式,用于在给定一些输入参数的情况下生成代码,编译器会将宏的每次调用替换为运行该公式的结果。因此您可以将宏视为自动代码替换,您可以在其中定义替换规则。Rust 的宏有许多不同的形状和大小,可以轻松实现许多不同形式的代码生成。两种主要类型是_声明宏_和_过程宏_, 熟练 C/C++ 的程序员可能已经习惯了 C 和 C++ 宏的恶心地方,比如你可以无所限制地使用 #define 将每个 true 更改为 0 或 1 的值,因此在不同的源文件中 true 和 false 的值可能产生混乱。另外,通常情况下,C/C++的宏并没有强制要求使用{}来包含宏中的代码段,因此也可能在一些if-else逻辑中宏代码可能被潜在的被分割或失效。甚至宏中的局部变量可能会对全局中的变量产生影响,弄脏使用环境。基于这些情况,就要求程序员连接宏的缺陷,使用规范的编程来避免宏的调用产生潜在的风险。

#define true 1
#define true 0

#define MAX(a, b)   a > b? a: b

// 变量意外被修改多次
MAX(a1++, b1++)

#define INC(a, b)   a++;b++

// 宏被分割了
if (true)
    INC(a, b)

Rust 中的宏与 C/C++ 宏的则有相似又有提升,能更加干净、安全得使用。以 Rust 声明宏为例,常用的println!就是声明宏。

/// # Examples
///
/// ```
/// println!(); // prints just a newline
/// println!("hello there!");
/// println!("format {} arguments", "some");
/// let local_variable = "some";
/// println!("format {local_variable} arguments");
/// ```
#[macro_export]
#[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(not(test), rustc_diagnostic_item = "println_macro")]
#[allow_internal_unstable(print_internals, format_args_nl)]
macro_rules! println {
    () => {
        $crate::print!("\n")
    };
    ($($arg:tt)*) => {{
        $crate::io::_print($crate::format_args_nl!($($arg)*));
    }};
}

Rust 的声明宏与 C/C++的#define 功能类似,但是更加先进。Rust的声明宏支持匹配多个模板,根据匹配结果选择不同的替换逻辑。同时匹配的过程中,不会污染宏外的环境,使用也非常灵活高效。




原文作者:Rust嵌入式;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2023-11-13

  • 博文量
    64
  • 访问量
    45583