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

在C++类中定义PCF8574 I2C扩展器时编译报错的问题

ESP32+PCF8574开发:类内初始化对象报错的解决办法

错误原因

你在类的成员声明里写PCF8574 i2c_ctrl(0x38);是不符合C++语法的。类定义内部声明成员变量时,不能直接用括号传参调用构造函数——这种写法会被编译器当成函数声明(试图声明一个返回PCF8574类型、名为i2c_ctrl、参数是0x38的函数,但0x38不是合法的参数类型,所以触发“expected identifier before numeric constant”错误)。

两种可行的解决方法

方法1:用C++11类内初始化语法

直接修改类内成员声明,用大括号或者等号初始化:

// 方式1:大括号初始化
PCF8574 i2c_ctrl{0x38};  
// 方式2:等号调用构造函数
PCF8574 i2c_ctrl = PCF8574(0x38);  

PlatformIO默认支持C++11及以上标准,所以这种写法可以直接用。

方法2:构造函数初始化列表

先声明成员变量,再通过类的构造函数初始化列表传参:

#include "PCF8574.h"

class I2C_devices{
    
    public:
        PCF8574 i2c_ctrl;  // 仅声明成员变量
        
        // 构造函数中用初始化列表初始化i2c_ctrl
        I2C_devices() : i2c_ctrl(0x38) {}

    void I2C_init() {
        i2c_ctrl.pinMode(P3,OUTPUT); // LED1
        i2c_ctrl.pinMode(P4,OUTPUT); // LED2
        i2c_ctrl.pinMode(P5,OUTPUT); // LED3
        i2c_ctrl.pinMode(P6,OUTPUT); // LED4
        i2c_ctrl.pinMode(P7,OUTPUT); // LED5
        i2c_ctrl.begin();
    }

    void Led1_On() {
        i2c_ctrl.digitalWrite(P3,LOW);
    }

    void Led2_On() {
        i2c_ctrl.digitalWrite(P4,LOW);
    }
};

效果说明

用以上任意一种方法修改后,i2c_ctrl作为类的成员变量,可以在所有成员函数中正常访问,同时解决了Option A中变量只能在函数内使用的问题。

内容的提问来源于stack exchange,提问作者Yigal B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:07:33