Ich habe ein C ++ - Projekt, das ich sowohl mit g++
auf meinem Rechner kompiliere (kompiliere zu "host") als auch mit einem ARM-Prozessor über einen Cross-Compiler (in meinem Fall arm-cortex_a8-linux-gnueabi-g++
). Ich bin dabei, in C ++ 0x / 11 Standart zu konvertieren, und es gibt einen Fehler, den ich bekomme, wenn ich Initialisierungsliste kompiliere, die ich im folgenden Schnipsel reproduzieren konnte:
Dieses Programm ist anscheinend korrekt, da -108
ein zulässiger Wert für char
ist.
Das Kompilieren mit g++
führt zu keinem Fehler mit der folgenden Befehlszeile:
Allerdings, wenn ich mit dem Cross-Compiler kompiliere, so:
%Vor%Ich erhalte den folgenden Fehler:
%Vor%Da der Wert legal ist, scheint dies ein Fehler zu sein. Kannst du erklären, warum ich diesen Fehler bekomme und was zu tun ist, um ihn zu lösen?
Bearbeiten : Beachten Sie, dass die Verwendung positiver Werte (z. B. 108
) zulässig ist und nicht zu einem Fehler bei beiden Compilern führt.
Wenn Sie eine Variable als char
deklarieren, ist die Implementierung abhängig davon, ob sie signiert oder unsigniert ist. Wenn Sie in der Lage sein müssen, negative Werte zu speichern, sollten Sie sie explizit als signed
deklarieren, anstatt sich auf den implementierungsdefinierten Standardwert zu verlassen.
Da der Wert legal ist
Woher weißt du das? char
s signedness ist eine Implementierung definiert. Und wenn es nicht signiert ist, ist Ihr Code schlecht durch Verengung - §8.5.4 / 7:
Eine einschränkende Umwandlung ist eine implizite Umwandlung
[...]
(7.4) - von einem Integer-Typ [...] zu einem Integer-Typ das kann nicht alle Werte des Originaltyps darstellen, außer wobei die Quelle ein konstanter Ausdruck ist, dessen Wert nach den Integral-Promotions in den Zieltyp passt.
§8.5.1 / 2:
Wenn die initializerklausel ein Ausdruck ist und eine Konvertierungskonvertierung (8.5.4) erforderlich ist, um den Ausdruck zu konvertieren, ist das Programm schlecht gebildet.
Wenn Sie jedoch eine signierte char
benötigen, verwenden Sie signed char
.
... wird garantiert funktionieren.
Tags und Links c++ c++11 linux cross-compiling