Можно ли проверить, что вы собираете для 64-битной с Microsoft C Compiler? - PullRequest
9 голосов
/ 30 октября 2009

Существует ли простой макрос препроцессора, который определен для 64-битной сборки? Я думал, что _WIN64 может быть так, но даже когда я строю 32-битную цель, части, заключенные в #ifdef _WIN64 ... #endif, компилируются, и это вызывает проблемы. Сегодня пятница, и я не могу думать прямо, но я уверен, что упускаю из виду кое-что очень простое здесь. Может быть, даже что-то, связанное с sizeof.

Ответы [ 4 ]

18 голосов
/ 30 октября 2009

Я всегда использовал _WIN64, чтобы проверить, является ли это 64-битной сборкой.

N.B. _WIN32 также всегда (автоматически) определяется MSVC в 64-битных сборках, поэтому проверьте _WIN64, прежде чем проверять _WIN32:

#if defined( _WIN64 )

// Windows 64 bit code here

#elif defined( _WIN32 )

// Windows 32 bit code here

#else

// Non-Windows code here

#endif
10 голосов
/ 30 октября 2009

Похоже, что ваша проблема может быть связана с заголовком или настройкой проекта, неправильно определяющими _WIN64 - это следует оставить компилятору.

Существует небольшая разница между WIN64 и _WIN64 (по крайней мере, для компиляторов Microsoft - другие компиляторы должны следовать их примеру, но не все делают):

  • _WIN64 определяется компилятором при создании программы для 64-битной платформы Windows. Обратите внимание, что это имя находится в пространстве имен разработчика компилятора (начальное подчеркивание и заглавная буква)
  • WIN64 определяется SDK платформы Windows (или как его там называют в этом году) при нацеливании на 64-битную платформу.

Так что, если вы используете только стандартные заголовки и не принимаете другие меры для его определения, WIN64 будет не определяться.

Существует аналогичная история для _WIN32 и WIN32 - но при проверке других компиляторов: GCC 3.4.5 определяет WIN32, даже если используются только стандартные заголовки. Как и Цифровой Марс.

Компиляторы Microsoft и Comeau нет.

Еще один из (надеюсь) хорошо известных мелочей заключается в том, что _WIN32 и WIN32 устанавливаются при нацеливании на 64-битные платформы Windows. В противном случае слишком много вещей сломалось бы.

8 голосов
/ 30 октября 2009

Компилятор Visual C ++ определяет следующие макросы:

  • _M_IX86 - платформа x86
  • _M_IA64 - платформа ia64
  • _M_X64 - платформа x64
2 голосов
/ 30 октября 2009

Проверьте свойства сборки вашего проекта, особенно раздел препроцессора. Вы определяете _WIN64 где-то в WIN32 сборках? sizeof вещь, вероятно, не будет работать, так как вы не можете использовать в #if тесте.

...