Ich verstehe nicht, warum ich diese Warnung bezüglich der Konvertierung zwischen signiert und nicht signiert erhalte. Ist mein Compiler falsch? [Duplikat]
Ich habe diesen Code:
#include <cstdint>
#include <deque>
#include <iostream>
int main()
{
std::deque<uint8_t> receivedBytes;
int nbExpectedBytes = 1;
if (receivedBytes.size() >= static_cast<size_t>(nbExpectedBytes))
{
std::cout << "here" << std::endl;
}
return 0;
}
Bei der -Wsign-Konvertierung wird dies ohne Warnung auf meinem Linux-Laptop kompiliert, aber unter dem eingebetteten Linux, auf dem es ausgeführt werden soll, wird die folgende Warnung angezeigt:
temp.cpp: In der Funktion 'int main ()': temp.cpp: 10: 33: Warnung: Die Konvertierung von 'int' in 'std :: deque :: size_type {aka long unsigned int}' kann das Vorzeichen von ändern Ergebnis [-Wsign-Konvertierung]
if (receivedBytes.size() >= static_cast<size_t>(nbExpectedBytes)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ich verstehe einfach nicht:
- Ich habe -Wsign-Konvertierung sowohl auf meinem Linux-Laptop als auch auf dem eingebetteten Linux aktiviert. Warum erhalte ich die Warnung nur auf dem eingebetteten Linux?
- Ich wandle explizit von
int
nachsize_t
(was keine Warnung erzeugen sollte, da die Besetzung explizit ist) und vergleiche dann asize_t
mit astd::deque<unsigned char>::size_type
. Wo ist also die implizite Konvertierung von signiert nach vorzeichenlos, die die Warnung auslöst?
Ich kann nicht anders, als zu denken, dass der Compiler unter dem eingebetteten Linux hier falsch ist. Vermisse ich etwas
Bearbeiten: Auf meinem Linux-Laptop verwende ich g ++ Version 9.3.0, während ich auf dem eingebetteten Linux g ++ Version 6.3.0 verwende (wahrscheinlich nicht die übliche Binärdatei, da es sich um eine ARM64-Architektur handelt).
Antworten
Dies ist zweifellos ein Fehler im eingebetteten Compiler. Durch das Trennen static_cast
von vom >=
Vergleich wird die Warnung entfernt, wie aus dem Testen des folgenden Codes im Compiler Explorer bei ausgewähltem ARM64 gcc 6.3.0 (Linux) hervorgeht:
#include <deque>
#include <cstddef>
#include <cstdint>
int main()
{
std::deque<uint8_t> receivedBytes;
int nbExpectedBytes = 1;
// Warning generated ...
while (receivedBytes.size() >= static_cast<size_t>(nbExpectedBytes))
{
break;
}
// Warning NOT generated ...
size_t blob = static_cast<size_t>(nbExpectedBytes);
while (receivedBytes.size() >= blob)
{
break;
}
return 0;
}
Außerdem verschwindet die Warnung auch beim Wechsel zum (32-Bit) ARM gcc 6.3.0 (Linux) Compiler.