Почему так много библиотек определяют свои собственные целые числа фиксированной ширины?

0

Вопрос

Поскольку, по крайней мере, C++11, мы получили прекрасные целые числа фиксированной ширины, например, в C++ <cstdint> или в буквах "С" <stdint.h> из коробки, (например std::uint32_t, std::int8_t), так что с или без std:: перед ними и даже в качестве макросов для минимальной ширины (INT16_C, UINT32_C и так далее).

Тем не менее, мы каждый день имеем дело с библиотеками, которые определяют свои собственные целые числа фиксированной ширины, и вы, возможно, видели, например sf::Int32, quint32, boost::uint32_t, Ogre::uint32, ImS32, ... Я могу продолжать и продолжать, если ты хочешь. Вы тоже, вероятно, знаете еще пару.

Иногда эти различия типов (также часто определения макросов) могут привести к конфликтам, например, когда вы хотите передать std целое число фиксированной ширины для функции из библиотеки, ожидающей целое число фиксированной ширины с точно такой же шириной, но определенной по-другому.

Смысл целых чисел фиксированной ширины в том, что они имеют фиксированный размер, что, как вы знаете, нам нужно во многих ситуациях. Так зачем же всем этим библиотекам использовать и вводить точно такие же целые числа, которые у нас уже есть в стандарте C++? Эти дополнительные определения иногда сбивают с толку, избыточны и могут вторгаться в вашу кодовую базу, что очень плохо. И если у них нет той ширины и жесткости, которые они обещают, они, по крайней мере, грешат против принципа наименьшего удивления, так в чем же их смысл, я вас спрашиваю?

c++ fixed-width integer
2021-11-23 14:45:24
1

Лучший ответ

5

Почему так много библиотек определяют свои собственные целые числа фиксированной ширины?

Вероятно, по некоторым из следующих причин:

  • они начались до C++11 или C11 (примеры: GTK, Qt, библиотеки, внутренние для GCC, Boost, FLTK, GTKmm, Jsoncpp, Eigen, Dlib, OpenCV, Wt)

  • они хотят иметь читаемый код в своих собственных namespace или class (наличие собственного пространства имен, как у Qt, может улучшить читаемость хорошо написанного кода).

  • они настраиваются во время сборки (например, с помощью GNU autoconf).

  • они хотят быть компилируемыми со старыми компиляторами C++ (например, некоторыми компиляторами C++03)

  • они хотят быть скомпилируемыми для дешевых встроенных микроконтроллеров, компилятор которых не является полным компилятором C++11.

  • они могут иметь общий код (или template-s, например, в Eigen или Dlib), возможно, для поддержки арифметики произвольной точности (или чисел), возможно, с использованием GMPlib.

  • они хотят быть каким-то образом доказуемыми с сертификатом Frama-C или DO-178C (для встроенных критически важных программных систем).

  • они зависят от процессора (например, asmjit, который генерирует машинный код во время выполнения на нескольких архитектурах).

  • они могут взаимодействовать с определенным оборудованием или языками программирования (Tensorflow, OpenCL, Cuda).

  • они хотят, чтобы их можно было использовать с помощью Python или GNU guile.

  • они могут быть специфичными для операционной системы.

  • они добавляют некоторые дополнительные проверки во время выполнения, например, против деления на 0 (или другого неопределенного поведения) или переполнения (что стандарт C++ не может требовать по соображениям производительности или истории)

  • они предназначены для легкого использования из машинного кода C++ (например, RefPerSys, ANTLR, ...)

  • они предназначены для вызова из кода C (например, libgccjit).

  • и т.д... Поиск других веских причин оставлен читателю в качестве упражнения.

2021-11-24 08:35:11

Ладно, ты победил. Я перестану закатывать глаза каждый раз, когда увижу такое.
nada

У меня так много кода, соответствующего первому пункту, что это не смешно.
user4581301

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................