我在没有太多资源的Atmel ATtiny85上打I²C有点麻烦。
因此,我为C++中的RTC模块DS1307编写了自己的实现。
我的类(class)定义如下:
class DS1307 {
public:
DS1307();
~DS1307() = default;
uint8_t getSeconds();
private:
I2c i2c;
const uint8_t address = 0b1101000; // Datasheet
};
相应的构造函数实现为:
#include "DS1307.h"
DS1307::DS1307(): i2c(address) {
}
尝试编译时,编译器抱怨:
src/DS1307.cpp: In member function 'DS1307::DS1307()':
src/DS1307.cpp:7:29: warning: 'this_4(D)->address' is used uninitialized in this function [-Wuninitialized]
DS1307::DS1307(): i2c(address) {
~~~~~~^~~~~~~
为什么?
我并不怀疑GCC的正确性,但我认为这就是初始化私有(private)字段的方式。
I2c
类将uint8_t
作为构造函数的唯一参数。 最佳答案
我的两分钱:因为初始化列表的计算顺序与成员在类中出现的顺序相同。您可以尝试交换两条声明行,它们的地址在I2C之前声明。
同样,在这样的小型设备上,将地址设为静态或使用预处理程序指令进行定义将更为高效。