У меня есть кодовая база с открытым исходным кодом, написанная как на C, так и на C ++. Я ищу целочисленный тип с гарантированной шириной не менее 64 бита, который может быть надежно скомпилирован на большинстве OS X (Intel, 64-бит) и 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
в качестве расширения до c ++ 11, так что, пока вы не отключите gcc-расширения, вы должны быть в порядке с использованиемlong long
на gcc (на самом деле я не думаю, что использовал / видел компилятор, который не предлагаю долго долго долго). - person Grizzly   schedule 18.09.2012int64_t
может иметь базовый типlong
илиlong long
среди других, что может вызвать проблемы с переносимостью, если требуется перегрузка. - person Mark B   schedule 18.09.2012int64_t
может привести к выбору разных версий в разных системах. См. этот другой вопрос о int64_t vs long vs long long - person Bo Persson   schedule 18.09.2012