Должен ли я использовать long long или int64_t для переносимого кода?

У меня есть кодовая база с открытым исходным кодом, написанная на 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 ++, у которых могли бы быть некоторые предложения относительно того, что может быть лучшим долгосрочным путем, учитывая вышеизложенную цель ,

36

Решение

Типы 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).

31

Другие решения

Это общее предложение использовать 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,

24

По вопросам рекламы [email protected]