#define指令特殊语法疑问:带参数宏USB_CONFIG_POWER_MA使用问题
Arduino USB_CONFIG_POWER_MA 宏定义相关问题解答
1. 宏定义中两处「mA」的含义
这是C语言带参数宏定义的标准写法:
- 第一处
mA出现在宏名后的括号内,是宏的形参,作用是接收调用该宏时传入的实际数值 - 第二处
mA出现在后方的运算表达式内,是对形参的引用,宏展开时会自动替换为调用时传入的实际值
举个实际调用的例子:当代码写USB_CONFIG_POWER_MA(100)时,宏会直接展开为((100)/2),最终得到数值50。这个除以2的逻辑是因为USB协议中配置电流的单位为2mA,除以2后可以直接得到符合协议要求的配置值。
2. 旧写法报错的原因
你之前的写法#define USB_CONFIG_POWER_MA(20)属于语法错误:C语言宏定义中,括号内的参数列表只能是合法的标识符,不能直接填写数字20。旧版本代码没有报错,是因为旧版本的该宏为无参宏,新版本改为带参宏后语法要求升级,才会触发编译错误。
3. 修改方案正确性判断
你的修改语法上可以通过编译,但功能逻辑完全错误。
你修改后的写法会让宏无论传入什么参数,最终展开结果都是((40)/2)=20,相当于宏的参数完全失效,后续所有调用该宏的代码逻辑都会出错。
如果你要固定USB最大电流为20mA,正确的修改方式有两种:
// 兼容带参调用场景的写法(所有传参都会被忽略,固定返回20mA对应的配置值10) #define USB_CONFIG_POWER_MA(mA) 10 // 如果你确定整个项目没有其他地方调用该宏传参,可以用无参写法 #define USB_CONFIG_POWER_MA 10
如果你只是需要在业务代码里设置20mA的电流,不需要修改内核头文件的原始宏定义,直接在用到的位置写USB_CONFIG_POWER_MA(20)调用即可。
内容的提问来源于stack exchange,提问作者Fred Darkh
相关产品推荐
相关产品推荐

