Codefrage zu Adaf HTU21 Library

Was macht die Zeile? (void)crc;
Einfach garnix?

float Adafruit_HTU21DF::readHumidity(void) {
    /* Prepare the I2C request. */
    Wire.beginTransmission(HTU21DF_I2CADDR);
    Wire.write(HTU21DF_READHUM);
    Wire.endTransmission();

    /* Wait a bit for the conversion to complete. */
    delay(50);

    /* Read the conversion results. */
    uint8_t count = Wire.requestFrom(HTU21DF_I2CADDR, 3);

    /* Make sure we got 3 bytes back. */
    if (count != 3) {
        return 0.0f;
    }

    /* Read 16 bits of data, dropping the last two status bits. */
    uint16_t h = Wire.read();
    h <<= 8;
    h |= Wire.read() & 0b11111100;

    uint8_t crc = Wire.read();
    (void)crc;

    float hum = h;
    hum *= 125.0f;
    hum /= 65536.0f;
    hum -= 6.0f;

    /* Track the value internally in case we need to access it later. */
    _last_humidity = hum;

    return hum;
}

Unterdrückt eine Compiler-Warnung wegen nicht verwendeten Variablen. Hier sollen nur Daten aus dem I2C Puffer ausgelesen und dann verworfen werden

Man könnte auch das machen:

Wire.read();

Aber dann bräuchte man einen Kommentar der sagt was das soll. So erklärt sich der Code selbst, da er sagt was da ausgelesen wird und das es explizit nicht gebraucht wird

So erklärt sich der Code selbst, da er sagt was da ausgelesen wird und das es explizit nicht gebraucht wird

Offensichtlich erklärt sich der Code nicht so gut wie ein individueller Kommentar.

   uint8_t crc = Wire.read();
   (void)crc; // Macht nichts, verhindert aber (warum eigentlich?) eine Compiler-Warnung

könnte man auch gut durch

   Wire.read(); // das dritte Byte (crc) verwenden wir nicht

ersetzen.
Käme auf einen Test an, ob im zweiten Beispiel nicht sogar ein Byte auf dem Stack "gespart" wird.
Also ob im ersten Fall der Verdacht des Compilers, dass crc sinnlos ist und weqgoptimiert werden kann, bestätigt oder widerlegt wird.

warum eigentlich?

Weil es der Standard in §5.2.9.6 so sagt:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf (Seite 109)

Any expression can be explicitly converted to type cv void, in which case it becomes a discarded-value
expression

Wire.read(); // das dritte Byte (crc) verwenden wir nicht

Halte ich für die schlechtere Lösung

Weil es der Standard in §5.2.9.6 so sagt

Danke für's Doku Vorlesen (Ehrlich) :slight_smile:
Schön, dass es dich max 12 Minuten gekostet hat.