Apakah mungkin _M_X64 tidak disetel pada prosesor x64?

Visual Studio Compiler (2005 hingga 2008) mendefinisikan empat makro untuk lingkungan x86/x64 bit. Lihat Makro Standar

  • _M_X64 Ditetapkan untuk prosesor x64.
  • _M_IX86 Ditetapkan untuk prosesor x86. Lihat tabel Nilai untuk _M_IX86 di bawah untuk informasi lebih lanjut. Ini tidak ditentukan untuk prosesor x64.
  • _WIN32 Ditetapkan untuk aplikasi untuk Win32 dan Win64. Selalu ditentukan.
  • _WIN64 Ditetapkan untuk aplikasi untuk Win64.

Sekarang pada mesin x32 bit _M_X64 tidak akan pernah disetel. Pada mesin 64 bit, jika Anda membangun di lingkungan 32 bit, _M_X64 tidak akan disetel dan _M_IX86 akan ditentukan. _WIN32 selalu ditentukan terlepas dari versi 32/64 bit.

Di semua prosesor x64, apakah ada arti khusus dari _M_X64? Bisakah ada skenario ketika _M_X64 tidak ditentukan ketika targetnya adalah x64?


person Abhijit    schedule 24.08.2012    source sumber
comment
Apakah makro ini bergantung pada mesin yang dijalankan kompiler? Atau apakah itu tergantung pada target program yang dikompilasi akan dijalankan? Ini penting, karena saya tidak mengerti pernyataan Anda Sekarang di mesin x32 bit. IMHO, makro ini hanya bergantung pada target. Dan Anda dapat mengkompilasi 64 target pada sistem 32 bit, sama seperti yang terjadi sebaliknya..   -  person Didier Trosset    schedule 24.08.2012
comment
@DidierTrosset: Jika saya tidak salah, mesin 32 bit (x32) tidak dapat membuat program untuk target 64 bit, jadi saya yakin pada mesin seperti itu _M_X64 akan selalu tidak terdefinisi.   -  person Abhijit    schedule 24.08.2012
comment
@Abhijit: Sistem 32-bit dapat membuat kode 64-bit dengan mudah. Dan laptop 64-bit saya di sini dapat membuat kode untuk setidaknya enam arsitektur prosesor yang berbeda (PPC, PPC64, i386, x86_64, ARMv6, dan ARMv7 yang terlintas di benak saya.) Arsitektur sistem build tidak ada hubungannya dengan kode yang dihasilkan.   -  person Jonathan Grynspan    schedule 24.08.2012


Jawaban (1)


Sekarang pada mesin x32 bit _M_X64 tidak akan pernah disetel

Bukan itu cara kerjanya. Kompiler yang Anda gunakan menghasilkan kode untuk arsitektur target tertentu, ia tidak peduli dengan mesin Anda. Menghasilkan kode x64 pada mesin 32-bit sangat mungkin, MSVC menyertakan kompiler silang yang dapat berjalan pada sistem operasi 32-bit dan menghasilkan kode untuk x64. Dan ia memiliki kompiler 64-bit yang menghasilkan kode x64. IDE diatur untuk benar-benar menggunakan kompiler silang, apa pun OS Anda.

Anda dapat melihat kompiler ini terinstal di mesin Anda, subdirektori vc\bin dari direktori instalasi VS. Direktori tersebut berisi kompiler 32-bit yang menghasilkan kode x86. Subdirektori x86_amd64 memiliki kompiler 32-bit yang menghasilkan kode x64. Subdirektori amd64 memiliki kompiler 64-bit yang menghasilkan kode x64. Direktori tambahan mungkin ada di sana jika Anda memiliki kompiler untuk inti ARM. Yang selalu merupakan kompiler silang.

Nama makro yang Anda tanyakan adalah makro yang telah ditentukan sebelumnya, daftar lengkap ada di sini. Makro _M_X64 selalu ditentukan oleh kompiler mana pun yang menghasilkan kode x64.

person Hans Passant    schedule 24.08.2012
comment
Terima kasih banyak atas penjelasannya. Itu membuat saya bertanya-tanya apakah mungkin pada Mesin 64 bit (prosesor 64 bit dengan OS 64 bit), untuk menargetkan prosesor 64 bit (_M_X64 ditentukan) untuk membangun versi 32 bit (_WIN64 tidak ditentukan) - person Abhijit; 24.08.2012
comment
Anda cukup menggunakan kompiler 32-bit untuk menghasilkan kode x86. _M_X64 tentu saja tidak akan ditentukan. Sepertinya Anda masih mencampurkan mesin tempat Anda menjalankan kompiler dengan arsitektur target. Fokus pada hal itu tidak peduli dengan mesin Anda. - person Hans Passant; 25.08.2012