取得宏展开#define TO_STRING( x ) TO_STRING1( x ) #define TO_STRING1( x ) #x

本文介绍了一种使用宏定义实现参数转换为字符串的技术。通过双重宏定义TO_STRING与TO_STRING1, 文章展示了如何将宏参数转换为其自身的字符串形式。这种技巧在调试或需要将变量名作为字符串输出的情况下非常有用。

#define TO_STRING( x ) TO_STRING1( x )
   #define TO_STRING1( x ) #x
   TO_STRING首先会将x全部展开(如果x也是一个宏的话),然后再传给TO_STRING1转换为字符串,现在你可以这样:
   const char *str = TO_STRING( PARAM( ADDPARAM( 1 ) ) );去一探PARAM展开后的样子

<think>我们有一个C/C++头文件,它定义了一个版本号的宏,并生成了一个版本字符串。 代码的功能是定义了一个头文件的保护宏,然后定义了主版本号、次版本号和修订号。 接着定义了两个宏:GET_STRING 和 GET_STRING_DIRECT,用于将数字换为字符串。 最后,使用这些宏来构建一个完整的版本字符串宏 LIVOX_ROS_DRIVER2_VERSION_STRING。 注释代码时,我们需要解释每一部分的作用。 注意:代码中有一个拼写错误:在第一个#define中,应该是INCLUDE而不是INClUDE(注意ClUDE中的'l'是小写的L,但这里是大写的I和小写的l?实际上,从代码看,第二次出现时是INClUDE,但头文件保护宏也是同样的错误。不过我们注释时直接按照代码原样注释,并指出可能的问题)。 另外,在最后一行,头文件保护宏的结束注释中,同样有INClUDE的拼写错误。 我们按照代码逐部分注释。 </think>以下是对代码的详细注释: ```c #ifndef LIVOX_ROS_DRIVER2_INClUDE_H_ // 头文件保护宏,防止重复包含 #define LIVOX_ROS_DRIVER2_INClUDE_H_ // 定义保护宏标识 // 版本号宏定义 #define LIVOX_ROS_DRIVER2_VER_MAJOR 1 // 主版本号 #define LIVOX_ROS_DRIVER2_VER_MINOR 0 // 次版本号 #define LIVOX_ROS_DRIVER2_VER_PATCH 0 // 修订版本号 // 字符串换宏 #define GET_STRING(n) GET_STRING_DIRECT(n) // 间接展开宏,确保参数被正确展开 #define GET_STRING_DIRECT(n) #n // 直接将参数字符串字面量 // 版本字符串组合宏 #define LIVOX_ROS_DRIVER2_VERSION_STRING \ // 组合完整版本字符串 GET_STRING(LIVOX_ROS_DRIVER2_VER_MAJOR) \ // 换主版本为字符串 "." GET_STRING(LIVOX_ROS_DRIVER2_VER_MINOR) \ // 添加点号+次版本 "." GET_STRING(LIVOX_ROS_DRIVER2_VER_PATCH) // 添加点号+修订版本 #endif // LIVOX_ROS_DRIVER2_INClUDE_H_ // 结束头文件保护 ``` ### 关键功能说明: 1. **头文件保护**:通过`#ifndef`防止重复包含 2. **版本管理**:使用分层宏定义实现语义化版本控制 3. **字符串化技巧**:通过两级宏`GET_STRING`确保宏参数完全展开后再字符串 4. **拼接语法**:利用相邻字符串字面量自动拼接的特性(如`"a" "b"`等价于`"ab"`) 5. **输出结果**:`LIVOX_ROS_DRIVER2_VERSION_STRING`最终展开为`"1.0.0"`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值