2014-11-14 7 views
6

In unserer Firma haben wir eine Richtlinie zur Kompilierung mit -Wconversion, die einige Konvertierungswarnungen erzeugt. Während ich diese zusätzliche Kontrolle verhindert Fehler machen zustimmen, ist es ärgerlich Warnungen abgekürzte Operatoren zu sehen, wie im folgenden Fall:Auflösen von Konvertierungswarnungen mit Compound-Zuweisungsoperatoren

uint8_t byte; 
byte += 8; // conversion to 'uint8_t' from 'int' may alter its value [-Wconversion] 

Nun kann dies, indem es als byte = (uint8_t)(byte+8) Umschreiben gelöst werden, was wiederum die Lesbarkeit des Codes reduziert.

Gibt es einen besseren Weg, dies zu tun?

+0

Wie genau kompilieren Sie das? Kompilieren mit gcc oder g ++ auf OSX gibt keine Warnungen :( –

+0

Kompilieren mit gcc und '-WConversion' und es sollte eine Warnung melden. –

+0

Nun, ich denke, das ist Clang spielt einen schlechten Witz auf mich. Hier ist was ich do: 'gcc -Wconversion -std = c99 -o prog main.c' gibt mir keine Warnungen Kompilieren mit' -Wall 'nur schlägt vor, die Variable zu initialisieren.Gerne es unter Linux in einer Sekunde versuchen –

Antwort

1

Betrachten Sie den Grund, warum Sie die Warnung bekommen, nämlich dass die Integer-Konstante 8 vom Typ int ist. Dass alles in C zu (signed) int befördert werden muss, ist ein bekannter Designfehler der Sprache.

Angenommen, Sie hatten byte += 256; oder byte += -1; oder byte += function_that_returns_int();. Alle von ihnen sind potentiell schwerwiegende Fehler, so dass die Warnung sicherlich sinnvoll ist.

Es gibt wirklich keine andere Problemumgehung, als das Ergebnis der Operation auf den beabsichtigten Typ uint8_t zu übertragen. Das ist nicht unbedingt eine schlechte Sache, da es einen selbstdokumentierenden Code erzeugt, der sagt "Ja, ich habe tatsächlich überlegt, welche Typen in dieser Berechnung verwendet werden, so dass es keine Überläufe geben sollte".

-1

Dies löst zwar nicht unbedingt Ihr Problem, gibt Ihnen aber zumindest den Hinweis, dass es für fast alles eine Lösung gibt.

#include <stdio.h> 
#include <stdint.h> 

#define SAFE_ADD(a,b) ((a) = (typeof(a))((a)+(b))) 

int main(void) 
{ 
     uint8_t byte = 0; 
     SAFE_ADD(byte, 8); 

     fprintf(stderr, "byte = %d \n", byte); 
     return 0; 
} 

w/o Warnungen mit gcc kompilierten 4.8.4 (gcc -Wall -Wconversion BYTE.C)
Hoffnung, das hilft.

+1

Kompilieren Sie nun mit 'gcc -std = c11 -pedantic-errors -Wall -Wconversion byte.c'. 'typeof' ist veralteter Nicht-Standard-Mist. Verwenden Sie stattdessen C11 '_Generic'. – Lundin

+0

Sie haben den Punkt verpasst, es ist egal, schauen Sie sich alte Kommentare oben an, anstatt eine vernünftige Lösung zu finden, sagen sie "Sagen Sie Ihrer Firma, dass sie ihre Politik ändern sollten ..., warum benutzen Sie -Weconversion, die nicht einmal eine ist Warnung, das .. und das .. "Was ich mache, ist eine Beispiellösung (mehr wie eine Vorlage). Was du sagst, kann leicht mit dem Schreiben des tatsächlichen Typs (uint8_t gegen typeof) und dem Umbenennen des Makros als SAFE_ADD_UINT8 oder irgendetwas, das du magst, behoben werden, und ich weiß, dass typeof auch eine GCC-Erweiterung ist, ich benutze sie nicht persönlich. –