在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
相关产品推荐
相关产品推荐

