2010-11-22 4 views
3

В 64-разрядной архитектуре long int, согласно gcc, является как минимум int64_t. На 32-битном, long int не менее int32_t. С компиляторами Microsoft long всегда является int32_t, независимо от 32/64-бит. Есть ли какой-либо способ:gcc, ширина длинного int на разных архитектурах

  1. Заставить gcc долго обрабатывать int64_t, на 32-битной? (для удобства тестирования)
  2. Заставить gcc долго обрабатывать int32_t на 64-битной? (для соответствия компилятору MS).

ответ

11

Не делайте этого - использовать стандартные типы, такие как int32_t, uint32_t, int64_t, uint64_t и т.д. от <stdint.h> а чем пытаться сделать предположения о голых типах, таких как long int, или пытаться сгибать компилятор по вашему желанию.

Примечание: 64-разрядная модель для любой данной платформы (например, LP64 для большинства платформ * nix, Mac OS X и т. Д.) Является заданной, поэтому даже если вы можете убедить компилятор использовать другую 64-битную модель вы, вероятно, нарушите любые вызовы системному коду, библиотекам и т. д.

+0

Смотрите мой комментарий к ответу Гоза. –

0

Вот почему в целом гораздо проще использовать набор typedefs, определенных для каждой платформы. Это действительно сэкономит вам много хлопот при компиляции на хаотических платформе-с-хаотическим компилятором-47,4

+0

Я использую cstdint boost во всех моих проектах. Я не могу заставить других членов моей команды или авторов библиотек сделать то же самое. Принуждение его на уровне компилятора (если это вообще возможно) кажется более безопасным. –

+0

@John: если ваши члены команды пишут хрупкий/небезопасный/не переносимый код, вам необходимо исправить их и/или их код. –

+0

@ M.M 'stdint.h' не всегда был в стандарте C. Он был введен в C99. – Kaz