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