У меня есть кодовая база с открытым исходным кодом, написанная на C и C ++. Я ищу целочисленный тип, который гарантированно будет по крайней мере 64-битная ширина, которая может быть надежно скомпилирована на большинстве операционных систем OS X (Intel, 64-bit) и Linux с компиляторами C и C ++ с открытым исходным кодом, без излишней дополнительной работы со стороны конечного пользователя. Поддержка Windows и 32-битных клиентов в настоящее время не важна.
Я провел некоторое тестирование на OS X, и последний GCC, который поставляется с инструментами разработчика, не поддерживает режим C + 11 (и, следовательно, не гарантирует доступность long long
). Clang это тоже не поддерживает, хотя и поддерживает long long
если включен режим C99, после определенной версии.
Это общее предложение использовать int64_t
на месте long long
Когда мобильность является важной целью? Использование спецификаторов формата кажется болезненным.
Могу ли я надежно бросить int64_t
в long long
(и аналогично unsigned
эквивалентно uint64_t
) использовать его с существующими функциями и библиотеками, которые принимают long long
как параметры? (И обратно, конечно.)
В этой ситуации, если я отправлю код, который требует функциональности Clang, а не GCC, собирается ли Clang заменить GCC в качестве предпочтительного компилятора в Linux? Можно ли ожидать от этого компилятора большей части предложения исходного кода для конечных пользователей?
По сути, я хотел бы попросить совета у других разработчиков, которые использовали оба типа для переносимого кода на C и C ++, у которых могли бы быть некоторые предложения относительно того, что может быть лучшим долгосрочным путем, учитывая вышеизложенную цель ,
Типы long long
а также unsigned long long
являются стандартными типами C и C ++, каждый из которых содержит не менее 64 бит. Все известные мне компиляторы предоставляют эти типы, за исключением случаев, когда -pedantic
режим, но в этом случае int64_t
или же uint64_t
также не будет доступен с компиляторами до C ++ 2011. На всех системах <stdint.h>
тоже доступно. То есть, насколько я могу судить, неважно, как вы пишете тип. Основная цель <stdint.h>
это обеспечить наилучшее совпадение для определенного количества битов. Если вам требуется как минимум 64-битная версия, но вы также хотите воспользоваться быстрой реализацией такого типа, вы должны использовать int_least64_t
или же uint_least64_t
от <stdint.h>
или же <cstdint>
(в случае последнего имена определяются в пространстве имен std
).
Это общее предложение использовать
int64_t
на местеlong long
Когда мобильность является важной целью?
Я был бы очень удивлен, если бы компилятор предложил int64_t
но нет long long
,
Если long long
присутствует, оно должно иметь как минимум 64 бита, поэтому приведение (u)int64_t
в (unsigned) long long
сохраняет ценность.
Если вам нужен тип с именно так 64 бита, использовать (u)int64_t
, если тебе надо по крайней мере 64 бита, (unsigned) long long
прекрасно, как было бы (u)int_least64_t
,