Я попытался скомпилировать пакет исходного кода и нашел проблемы, связанные с версией.
Когда я делаю это на своем компьютере, все идет хорошо; но когда я компилирую его на другом компьютере, он выдает много утверждений о том, что INT32_MAX не определен. Оба компьютера запускают систему Debian, и разница в том, что мой компьютер использует Testing repo и имеет gcc 4.9, а на другом компьютере используется Stable repo., У которого немного более старый gcc 4.7.
Затем я подробно просмотрю /usr/include/stdint.h
. К удивлению, на компьютере, требующем неопределенные макросы, все макросы int range определены внутри условия C++:
/**
* I forget the exact definition,
* but it looks like this:
*/
#ifndef __cplusplus ......
......
# define INT32_MIN XXX
# define INT32_MAX XXX
......
#endif
В результате пакет не увидит эти макросы стандартного диапазона, так как это проект C++ и использует g++ для компиляции.
Почему stdint.h
из gcc 4.7 спроектирован так? Это означает, что gcc 4.7 не хочет, чтобы я использовал эти целые диапазоны с C++, а gcc 4.9 разрешает это?
И самое главное: как мне обойти это?
В C++ вам рекомендуется использовать std :: numeric_limits #include <limits>
:
Пример использования cplusplus.com
// numeric_limits example
#include <iostream> // std::cout
#include <limits> // std::numeric_limits
int main () {
std::cout << std::boolalpha;
std::cout << "Minimum value for int: " << std::numeric_limits<int>::min() << '\n';
std::cout << "Maximum value for int: " << std::numeric_limits<int>::max() << '\n';
std::cout << "int is signed: " << std::numeric_limits<int>::is_signed << '\n';
std::cout << "Non-sign bits in int: " << std::numeric_limits<int>::digits << '\n';
std::cout << "int has infinity: " << std::numeric_limits<int>::has_infinity << '\n';
return 0;
}
Включите climits или limits.h, который содержит размеры интегральных типов. Этот заголовок определяет константы с пределами фундаментальных интегральных типов для конкретной системы и используемой реализации компилятора. Пределы для основных типов с плавающей запятой определены в cfloat (ранее float.h). Пределы для конкретных по ширине интегральных типов и других типов typedef определены в cstdint (ранее stdint.h).
Вы должны включить cstdint вместо stdint.h
cstdint
не может использоваться до C ++ 11
<cstdint>
?std::numeric_limits
.