You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:50:12