Кроссплатформенное определение 64-битных целых чисел в C ++ для Windows и Linux

Я пытаюсь написать кроссплатформенный код на C ++ для Windows (MinGW) и Linux (g ++). Я использовал для определения 64-битных целых чисел в Linux как «long», но когда я перешел на MinGW, sizeof (long) вернул 4 байта. Затем я обнаружил, что могу использовать «long long» или «__INT64» для определения 64-битных целых чисел в MinGW. У меня есть два вопроса:

1.-Какой самый удобный способ определения 64-битных целых чисел для Windows и Linux? В настоящее время я использую #ifdef, но я не знаю, является ли это лучшим способом сделать это:

#ifdef LINUX
#define INT64 long
#elif WIN32
#define INT64 long long
#endif

2.-Должен ли я использовать «long long» или «__INT64» в MinGW? и почему?

8

Решение

Вы можете использовать тип int64_t, который определен в заголовке cstdint, Это стандартно для C ++ 11.

Обратите внимание, что этот тип может не существовать, если используемая вами платформа не поддерживает 64-битные целые числа.

Что касается long longЭто еще одна возможность. long longШирина не менее 64 бит. Обратите внимание, что он является стандартным для C ++ 11, хотя он будет работать на нескольких компиляторах при использовании C ++ 03.

Как упоминал Пит Беккер, вы могли бы использовать int_least64_t, Это хороший выбор, если вы не возражаете против использования 64-битных целых чисел, но некоторого целочисленного типа, который по крайней мере Ширина 64 бита

14

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

Я считаю, что на вопрос о том, как получить 64-разрядное целое число было дано достаточно ответа, но я постараюсь сделать второй шаг, использовать ли «long long» или «__INT64». Вопрос, на который вам нужно ответить в первую очередь, это то, что вам нужно. Если по какой-то причине вам нужны ровно 64 бита, во что бы то ни стало, используйте то, что дает именно эти 64 бита, то есть int64_t. Даже если у вашей платформы / компилятора нет stdint.h, создайте свой typedef как подходящий тип в качестве обходного пути (# ifdef’d для компилятора), потому что это делает ваш код более самодокументируемым. С другой стороны, если вы обрабатываете, например, смещения в больших сегментах памяти (например, образе DVD) используют size_t или ssize_t, потому что они, как правило, имеют тот же размер, что и указатель, который также самодокументируется. Аналогично, смещение в файле лучше всего представить с помощью fpos_t.

Кстати: предположение, что «long» — это 64 бита в Linux, неверно. В частности на 32-битных вариантах это не 64 бит, и я также не уверен, действительно ли все 64-битные варианты используют 64-битные длинные. Эти разные системы называются ILP32, LP64 и LLP64. Поиск этих терминов в Интернете!

2

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