często używam przypisanie „już” wpisane zmienne „krótsze” jedynki, na przykład int
do short
lub uint32_t
do uint8_t
. Pewnego dnia postanowiłem znaleźć wszystkie takie przypadki w moim kodzie za pomocą gcc, ale ku mojemu zaskoczeniu odkryłem, że gcc nie wyświetla żadnych ostrzeżeń!Brak ostrzeżenia o cesji int do krótkiego (GCC)
int long_value;
short short_value;
std::cin >> long_value; // Example input: 32769
short_value = long_value; // MS Visual Studio complains here at warning level 4
std::cout << "Long: " << long_value << '\n'; // My example output: 32769
std::cout << "Short: " << short_value << '\n'; // My example output: -32767
Korzystanie gcc -Wall
lub gcc -Wconversion
nie pomogło (gcc nie wyjście żadnego ostrzeżenia). W rzeczywistości nigdy nie generuje żadnego ostrzeżenia dla żadnego typu wejścia i wyjścia (na przykład long
i unsigned char
).
Nigdy nie znalazłem faktycznego błędu w gcc, więc jestem prawie pewien, że to zachowanie ma powód.
Dlaczego więc nie ma ostrzeżenia?
Aktualizacja: korzystam z gcc 4.1.2.
@icecrime: gcc na pewno musi go skompilować. Na platformach, gdzie krótki jest krótszy niż int, powinien i ostrzega. –