#define __T(x) L ## x 语法

本文详细介绍了C++中用于连接变量和字符串的模板元编程技术,包括连接符`#defineConn`、字符串转换相关宏`#ToChar`和`#ToString`的使用方法和特性。通过实例演示了如何利用这些技术实现字符串拼接和常量字符串创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://zhidao.baidu.com/link?url=0ScJB2EgiKn2OAQ2sBJVGehYKdKM5-9a1hZAEb75BfsdHycQ_6jk6ZN1BRg88MN_3Gv16KCdaHdKSHqcYtxWrq


表示L与x连接。

以下来自网络:
#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示什么?表示x连接y,举例说:
int  n = Conn(123,456);  结果就是n=123456;
char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";
怎么样,很神奇吧

再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:
char a = ToChar(1);结果就是a='1';
做个越界试验char a = ToChar(123);结果是a='3';
但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant   :P

最后看看#x,估计你也明白了,他是给x加双引号
char* str = ToString(123132);就成了str="123132";

代码段1:u8 gmp108l_initialization(void) { u8 rc, u8Data; /***** check sensor version *****/ rc = gmp108l_burst_read(GMP108L_REG_REV_ID, &u8Data, 1); if (rc != 0) return (rc); GMP108L_LOG_DEBUG("Sensor Value = 0x%02X", u8Data); /***** check sensor ID *****/ rc = gmp108l_burst_read(GMP108L_REG_CHIP_ID, &u8Data, 1); if (rc != 0) return (rc); GMP108L_LOG_DEBUG("Sensor Value = 0x%02X", u8Data); /***** (Reg)FIFO_CONFIG_1, enable filtered data, subsampling interval: 0, *****/ u8Data = 0x00; rc = gmp108l_burst_write(GMP108L_REG_FIFO_CONFIG_1, &u8Data, 1); if (rc != 0) return (rc); /***** (Reg)INT_CTRL, enable data ready interrupt, *****/ u8Data = 0x40; rc = gmp108l_burst_write(GMP108L_REG_INT_CTRL, &u8Data, 1); if (rc != 0) return (rc); /***** (Reg)OSR, oversampling ratio (P & T) *****/ u8Data = 0x35; // OSR_T: x8, OSR_P: x32 rc = gmp108l_burst_write(GMP108L_REG_OSR, &u8Data, 1); if (rc != 0) return (rc); /***** (Reg)ODR, output data rate) *****/ u8Data = 0x16; // ODR: 6.4Hz rc = gmp108l_burst_write(GMP108L_REG_ODR, &u8Data, 1); if (rc != 0) return (rc); /***** (Reg)FILTER, IIR-filter_coe_P, IIR-filter_coe_T, *****/ // u8Data = 0x00; // filter-coes: 0 u8Data = 0x33; // filter-coes: 7 rc = gmp108l_burst_write(GMP108L_REG_FILTER, &u8Data, 1); if (rc != 0) return (rc); return (rc); } 代码段2:// 定义日志级别(可根据需求调整) #define GMP108L_LOG_LEVEL_NONE 0 // 关闭所有日志 #define GMP108L_LOG_LEVEL_ERROR 1 // 仅错误 #define GMP108L_LOG_LEVEL_WARN 2 // 错误+警告 #define GMP108L_LOG_LEVEL_INFO 3 // 错误+警告+信息 #define GMP108L_LOG_LEVEL_DEBUG 4 // 全部日志(调试用) // 设置当前日志级别(发布版本可改为 GMP108L_LOG_LEVEL_NONE 或 GMP108L_LOG_LEVEL_ERROR) #ifndef GMP108L_LOG_LEVEL #define GMP108L_LOG_LEVEL GMP108L_LOG_LEVEL_DEBUG #endif // 平台输出函数(替换为实际平台的打印函数,如 hal_uart_printf) #ifndef PLATFORM_LOG_PRINT #define PLATFORM_LOG_PRINT(...) printf(__VA_ARGS__) // 默认使用标准 printf #endif // 日志宏定义(包含文件、行号、函数名) #define GMP108L_LOG(level, fmt, ...) do { \ if ((level) <= GMP108L_LOG_LEVEL) { \ PLATFORM_LOG_PRINT("[GMP108L][%s][%s:%d] ", \ #level, __func__, __LINE__); \ PLATFORM_LOG_PRINT(fmt, ##__VA_ARGS__); \ PLATFORM_LOG_PRINT("\n"); \ } \ } while(0) // 简化不同级别调用的宏 #define GMP108L_LOG_ERROR(fmt, ...) GMP108L_LOG(GMP108L_LOG_LEVEL_ERROR, "ERROR", fmt, ##__VA_ARGS__) #define GMP108L_LOG_WARN(fmt, ...) GMP108L_LOG(GMP108L_LOG_LEVEL_WARN, "WARN", fmt, ##__VA_ARGS__) #define GMP108L_LOG_INFO(fmt, ...) GMP108L_LOG(GMP108L_LOG_LEVEL_INFO, "INFO", fmt, ##__VA_ARGS__) #define GMP108L_LOG_DEBUG(fmt, ...) GMP108L_LOG(GMP108L_LOG_LEVEL_DEBUG, "DEBUG", fmt, ##__VA_ARGS__) #define gmp108l_get_bitslice(regvar, bitname) \ ((regvar & bitname##__MSK) >> bitname##__POS) #define gmp108l_set_bitslice(regvar, bitname, val) \ ((regvar & ~bitname##__MSK) | ((val<<bitname##__POS) & bitname##__MSK)) 报错:../../platform/huaqin_drivers/src/sensor/GMP108L/GMP108L.c: In function 'gmp108l_initialization': ../../platform/huaqin_drivers/src/sensor/GMP108L/GMP108L.h:307:75: warning: too many arguments for format [-Wformat-extra-args] 307 | #define GMP108L_LOG_DEBUG(fmt, ...) GMP108L_LOG(GMP108L_LOG_LEVEL_DEBUG, "DEBUG", fmt, ##__VA_ARGS__) | ^~~~~~~ ../../platform/huaqin_drivers/src/sensor/GMP108L/GMP108L.h:290:40: note: in definition of macro 'PLATFORM_LOG_PRINT' 290 | #define PLATFORM_LOG_PRINT(...) printf(__VA_ARGS__) // 默认使用标准 printf | ^~~~~~~~~~~ ../../platform/huaqin_drivers/src/sensor/GMP108L/GMP108L.h:307:38: note: in expansion of macro 'GMP108L_LOG' 307 | #define GMP108L_LOG_DEBUG(fmt, ...) GMP108L_LOG(GMP108L_LOG_LEVEL_DEBUG, "DEBUG", fmt, ##__VA_ARGS__) | ^~~~~~~~~~~ ../../platform/huaqin_drivers/src/sensor/GMP108L/GMP108L.c:206:3: note: in expansion of macro 'GMP108L_LOG_DEBUG' 206 | GMP108L_LOG_DEBUG("Sensor Value = 0x%02X", u8Data);怎么改
06-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值