Подтвердить что ты не робот

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

4b9b3361

Ответ 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.