类函数宏

本文通过一个简单的C语言程序示例介绍了宏定义的使用方法及其运算特点。通过对两个不同宏定义(ok 和 okk)的对比,展示了如何进行表达式的正确括号包裹以实现预期的功能。此外,还提供了程序运行结果的输出示例。
/*
 ============================================================================
 Name        : kinson.c
 Author      : 
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>

#define ok(x) x*x
#define okk(x) (x)*(x)

int main(void)
{
    int a = 2;
    int b = 3;
    int c = ok(a+b);//6+5=11
    //int c = a+b*a+b;
    int d = okk(a+b);//
    //int d = (a+b)*(a+b)
    printf("ok(a+b)= a+b*a+b=%d\n",c);
    printf("okk(a+b)= (a+b)*(a+b)=%d\n",d);//5*5=25
    return EXIT_SUCCESS;
}

 

 

转载于:https://www.cnblogs.com/kinson/p/7592540.html

### 函数宏介绍 函数宏是看起来像函数调用的宏,比普通函数更加灵活,例如可以接收不定数量的参数。以Rust中的函数宏为例,它获取TokenStream参数,其定义使用Rust代码操纵TokenStream。一个函数宏的例子是可以像这样被调用的sql!宏:`let sql = sql!(SELECT * FORM posts WHERE id=1);` [^1]。 ### 属性宏介绍 属性宏通常用于为结构体、枚举、函数等项添加额外的元数据或行为。它们可以在编译时修改代码的生成,常用于代码生成、自动实现特征等场景。比如在Rust的`serde`库中,`#[derive(Serialize, Deserialize)]`就是属性宏,它可以为结构体自动生成序列化和反序列化的代码。 ### 区别 - **语法形式**:函数宏的调用形式似函数调用,如`sql!(...)`;而属性宏以`#[...]`的形式附着在项的前面,如`#[derive(Serialize)] struct MyStruct {... }`。 - **功能侧重点**:函数宏主要用于根据输入的参数生成代码片段,更侧重于代码的复用和灵活的参数处理;属性宏侧重于为项添加额外的编译时行为或元数据,对项本身进行修改或增强。 - **参数传递方式**:函数宏可以接收不定数量的参数,并且参数的处理通常在宏定义中进行;属性宏的参数通常是固定的,并且是在属性标记中指定,例如`#[attr(arg1, arg2)]`。 ### 使用场景 - **函数宏使用场景**:当需要根据不同的输入生成不同的代码片段,且输入参数数量不固定时,函数宏是一个很好的选择。例如,在编写数据库查询语句生成器时,可以使用函数宏根据不同的查询条件生成相应的SQL语句。 - **属性宏使用场景**:当需要为型或函数添加一些通用的行为,如序列化、调试信息输出、自动实现特征等,属性宏可以大大简化代码。例如,在编写Web应用程序时,使用属性宏为数据模型自动生成JSON序列化和反序列化代码。 ### 代码示例 #### 函数宏示例(Rust) ```rust macro_rules! add { ($a:expr, $b:expr) => { $a + $b }; } fn main() { let result = add!(3, 5); println!("Result: {}", result); } ``` #### 属性宏示例(Rust,使用`serde`库) ```rust use serde::{Serialize, Deserialize}; #[derive(Serialize, Deserialize, Debug)] struct Person { name: String, age: u8, } fn main() { let person = Person { name: "John".to_string(), age: 30, }; let json = serde_json::to_string(&person).unwrap(); println!("JSON: {}", json); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值