当前位置: 首页 > article >正文

rtthread学习笔记系列(1) -- 宏

文章目录

  • 1. 宏
    • 1. 编译警告宏
    • 2. 宏过载
    • 3. 宏定义
    • 4. #undef

  • 源文件路径: https://github.com/wdfk-prog/RT-Thread-Study

1. 宏

1. 编译警告宏

/* compile time assertion */
#define RT_STATIC_ASSERT(name, expn) typedef char _static_assert_##name[(expn)?1:-1]

expn:判断条件;当条件不满足时;数组的长度初始化为-1,即编译报错;

用#waring 编译判断更为合理

2. 宏过载

#define __MSH_GET_MACRO(_1, _2, _3, _FUN, ...)  _FUN

/**
 * @ingroup msh
 *
 * This macro exports a command to module shell.
 *
 * @param command is the name of the command.
 * @param desc is the description of the command, which will show in help list.
 * @param opt This is an option, enter any content to enable option completion
 */
/* MSH_CMD_EXPORT(command, desc) or MSH_CMD_EXPORT(command, desc, opt) */
#define MSH_CMD_EXPORT(...)                                 \
    __MSH_GET_MACRO(__VA_ARGS__, _MSH_FUNCTION_CMD2_OPT,    \
        _MSH_FUNCTION_CMD2)(__VA_ARGS__)
  • 这个宏 __MSH_GET_MACRO的作用是选择一个函数来调用。它接受五个参数:_1_2_3_FUN__VA_ARGS__,然后返回 _FUN

    __MSH_GET_MACRO被用来根据传入的参数数量来选择要调用的函数。具体来说,如果传入的参数数量为2,那么 _FUN就是 _MSH_FUNCTION_CMD2;如果传入的参数数量为3,那么 _FUN就是 _MSH_FUNCTION_CMD2_OPT

    这种技术被称为宏过载,它允许你根据传入的参数数量来选择不同的宏来执行。

    _FUN在这里的作用是作为一个占位符,它代表了要调用的函数。

3. 宏定义

#define RTM_EXPORT(symbol)                                            \
const char __rtmsym_##symbol##_name[] rt_section(".rodata.name") = #symbol;     \
const struct rt_module_symtab __rtmsym_##symbol rt_section("RTMSymTab")= \
{                                                                     \
    (void *)&symbol,                                                  \
    __rtmsym_##symbol##_name                                          \
};
  1. __rtmsym_##symbol##_name:这是一个字符串常量,存储在 .rodata.name段中。
  2. __rtmsym_##symbol:这是一个 rt_module_symtab结构体的实例,存储在 RTMSymTab段中(.text)。它包含两个字段:
    • 一个是指向符号的指针。
    • 另一个是指向符号名称的指针。

这个宏定义的目的是为了在运行时能够通过符号的名称查找到符号的地址,实现动态链接和加载模块.

4. #undef

  • #undef 标识符,用来将前面定义的宏标识符取消定义。

http://www.kler.cn/a/503774.html

相关文章:

  • 计算机网络八股文学习笔记
  • linux: 文本编辑器vim
  • 国产Docker可视化面板Dpanel的安装与功能解析
  • ssh2详细使用步骤,以及常用方法介绍
  • unity打包sdk热更新笔记
  • C++实现设计模式---原型模式 (Prototype)
  • k8s故障 ImagePullBackOff状态排错
  • vLLM私有化部署大语言模型LLM
  • 清华大学AutoDroid-V2,软件测试行业将如何发展
  • CMD批处理命令入门(6)——常用的特殊字符
  • android studio根据包名获取当前安装包信息
  • java基础概念55-不可变集合
  • springcloud负载均衡原理
  • rtthread学习笔记系列--17IPC
  • android framework开发如何入门
  • 【Vue - Element 】实现表单输入框的远程搜索功能
  • 【OpenGL/Assimp】渲染模型、半透明材质与封装光源
  • Web开发(一)HTML5
  • Elasticsearch Python 客户端是否与自由线程 Python 兼容?
  • 关于2025年智能化招聘管理系统平台发展趋势
  • 单体 vs 微服务 怎么选?
  • springboot高校教室资源管理平台
  • 2501,wtl显示html
  • 基于springboot+vue的洪涝灾害应急信息管理系统设计与实现
  • 【蓝桥杯】Python算法——快速幂
  • Python文档生成利器 - Sphinx入门指南