我在没有太多资源的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之前声明。

同样,在这样的小型设备上,将地址设为静态或使用预处理程序指令进行定义将更为高效。

10-04 14:33