Можно ли сбросить _M_X64 на процессоре x64?

Компиляторы Visual Studio (с 2005 по 2008 год) определяют четыре макроса для x86/x64-битной среды. См. Предопределенные макросы

  • _M_X64 Определено для процессоров x64.
  • _M_IX86 Определено для процессоров x86. Дополнительную информацию см. в таблице значений для _M_IX86 ниже. Это не определено для процессоров x64.
  • _WIN32 Определено для приложений для Win32 и Win64. Всегда определяется.
  • _WIN64 Определено для приложений для Win64.

Теперь на 32-битной машине _M_X64 никогда не будет установлен. На 64-битной машине, если вы строите 32-битную среду, _M_X64 будет не установлен, а _M_IX86 будет определен. _WIN32 всегда определяется независимо от 32/64-битной сборки.

Имеет ли значение _M_X64 особое значение для всех процессоров x64? Может ли быть сценарий, когда _M_X64 не определено, когда цель - x64?


person Abhijit    schedule 24.08.2012    source источник
comment
Зависят ли эти макросы от машины, на которой работает компилятор? Или это зависит от цели, на которой будет работать скомпилированная программа? Это важно, так как я не понимаю вашего утверждения Теперь на 32-разрядной машине. ИМХО, эти макросы зависят только от цели. И вы можете скомпилировать для цели 64 на 32-битной системе, как и обратное.   -  person Didier Trosset    schedule 24.08.2012
comment
@DidierTrosset: Если я не ошибаюсь, 32-битная машина (x32) не может создавать программы для 64-битной цели, поэтому я считаю, что на таких машинах _M_X64 всегда будет неопределенным.   -  person Abhijit    schedule 24.08.2012
comment
@Abhijit: 32-битная система может легко создавать 64-битный код. И мой 64-битный ноутбук здесь может собирать код по крайней мере для шести различных процессорных архитектур (PPC, PPC64, i386, x86_64, ARMv6 и ARMv7 навскидку). Архитектура системы сборки не имеет ничего общего с сгенерированный код.   -  person Jonathan Grynspan    schedule 24.08.2012


Ответы (1)


Теперь на 32-битной машине _M_X64 никогда не будет установлен

Это не так работает. Используемый вами компилятор генерирует код для конкретной целевой архитектуры, ему все равно на вашей машине. Создание кода x64 на 32-битной машине вполне возможно, MSVC включает в себя кросс-компилятор, который может работать в 32-битной операционной системе и генерировать код для x64. И у него есть 64-битный компилятор, который генерирует код x64. IDE настроена на фактическое использование кросс-компилятора независимо от вашей ОС.

Вы можете увидеть эти компиляторы, установленные на вашем компьютере, в подкаталоге vc\bin каталога установки VS. Этот каталог содержит 32-разрядный компилятор, генерирующий код x86. В подкаталоге x86_amd64 находится 32-разрядный компилятор, генерирующий код x64. В подкаталоге amd64 находится 64-битный компилятор, генерирующий код x64. Там могут существовать дополнительные каталоги, если у вас есть компиляторы для ядер ARM. Которые всегда являются кросс-компиляторами.

Имена макросов, о которых вы спрашиваете, являются предопределенными макросами, полный список здесь< /а>. Макрос _M_X64 всегда определяется любым из компиляторов, генерирующих код x64.

person Hans Passant    schedule 24.08.2012
comment
Большое спасибо за объяснение. Это заставляет меня задаться вопросом, возможно ли на 64-битной машине (64-битный процессор с 64-битной ОС) настроить 64-битный процессор (_M_X64 определен) для создания 32-битной сборки (_WIN64 не определен) - person Abhijit; 24.08.2012
comment
Вы просто используете 32-битный компилятор для генерации кода x86. _M_X64, конечно, не будет определен. Похоже, вы все еще смешиваете машину, на которой вы запускаете компилятор, с целевой архитектурой. Сосредоточьтесь на этом, не заботясь о вашей машине. - person Hans Passant; 25.08.2012