C++中传递Adafruit_MCP23X17对象是否合法?ESP32项目问询
问题解答
这种传递方式语法上是合法的,但逻辑上存在严重问题,根本达不到你想要的IO初始化效果。
问题原因
当你按值传递Adafruit_MCP23X17对象时,函数会创建一个原对象的副本。你在expander_Init里调用pinMode、digitalWrite等方法,修改的都是这个副本的状态,和你在setup里初始化的那个原对象没有任何关系。函数执行完毕后,副本会被销毁,原对象的IO配置完全没被改动,等于这个初始化函数白执行了。
正确的写法
要让函数操作原对象本身,你需要用引用传递或者指针传递,推荐用引用传递,语法更简洁:
引用传递的修改示例
函数定义(头文件和实现里都要改):
void expander_Init(Adafruit_MCP23X17 &pin_Expander) // 加&表示引用传递 { // Load the GPIOs pin_Expander.pinMode(pin1_Motor1, OUTPUT); // Set all GPIOs to LOW pin_Expander.digitalWrite(pin1_Motor1, LOW); }
调用时不需要修改,还是原来的写法:
expander_Init(pin_Expander);
指针传递的修改示例(可选)
如果习惯用指针,也可以这么写:
函数定义:
void expander_Init(Adafruit_MCP23X17 *pin_Expander) { // Load the GPIOs pin_Expander->pinMode(pin1_Motor1, OUTPUT); // Set all GPIOs to LOW pin_Expander->digitalWrite(pin1_Motor1, LOW); }
调用时需要传递对象的地址:
expander_Init(&pin_Expander);
总结
引用传递是最优选择,既避免了值传递的副本开销,又能保证函数直接修改原对象的状态,完美实现你的IO初始化需求。
内容的提问来源于stack exchange,提问作者Teebow
相关产品推荐
相关产品推荐

