stdint.h не совместим с C ++?

0

Я попытался скомпилировать пакет исходного кода и нашел проблемы, связанные с версией.

Когда я делаю это на своем компьютере, все идет хорошо; но когда я компилирую его на другом компьютере, он выдает много утверждений о том, что 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 разрешает это?

И самое главное: как мне обойти это?

  • 3
    Вы получаете то же самое, если вы включаете <cstdint> ?
  • 3
    std::numeric_limits .
Показать ещё 2 комментария
Теги:
glibc
macros
compatibility

2 ответа

4
Лучший ответ

В 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;
}
  • 0
    Эти «черты» реализуются через шаблон класса и статические функции-члены. По сравнению с реализацией макросов, это вызовет фактические вызовы функций во время выполнения?
  • 0
    Оптимизирован при компиляции как постоянные значения
0

Включите climits или limits.h, который содержит размеры интегральных типов. Этот заголовок определяет константы с пределами фундаментальных интегральных типов для конкретной системы и используемой реализации компилятора. Пределы для основных типов с плавающей запятой определены в cfloat (ранее float.h). Пределы для конкретных по ширине интегральных типов и других типов typedef определены в cstdint (ранее stdint.h).

Вы должны включить cstdint вместо stdint.h

  • 0
    cstdint не может использоваться до C ++ 11

Ещё вопросы

Сообщество Overcoder
Наверх
Меню