Pertanyaan Apakah mungkin untuk memeriksa apakah Anda sedang membangun untuk 64-bit dengan Microsoft C Compiler?


Apakah ada makro preprocessor sederhana yang didefinisikan untuk membangun 64-bit? saya pikir _WIN64 mungkin itu, tetapi bahkan ketika saya membangun target 32-bit, bagian-bagian tertutup dalam #ifdef _WIN64 ... #endif dikompilasi, dan ini menyebabkan masalah. Ini hari Jumat dan saya tidak bisa berpikir jernih, tapi saya yakin saya mengabaikan sesuatu yang sangat sederhana di sini. Bahkan mungkin ada sesuatu yang melibatkan sizeof.


9
2017-10-30 03:52


asal


Jawaban:


Saya selalu menggunakan _WIN64 untuk memeriksa apakah itu adalah build 64 bit.

N.B. _WIN32 juga selalu (otomatis) ditentukan oleh MSVC dalam bentuk 64 bit, jadi periksa _WIN64 sebelum Anda memeriksa _WIN32:

#if defined( _WIN64 )

// Windows 64 bit code here

#elif defined( _WIN32 )

// Windows 32 bit code here

#else

// Non-Windows code here

#endif

18
2017-10-30 04:30



Kedengarannya seperti masalah Anda mungkin terkait dengan header atau pengaturan proyek tidak benar mendefinisikan _WIN64 - yang harus diserahkan kepada kompilator.

Ada perbedaan halus antara WIN64 dan _WIN64 (setidaknya untuk kompiler Microsoft - kompiler lain harus mengikutinya, tetapi tidak semua):

  • _WIN64 ditentukan oleh penyusun ketika membangun program untuk platform Windows 64-bit. Perhatikan bahwa nama ini berada di namespace kompilator pelaksana (leading underscore diikuti oleh huruf kapital)
  • WIN64 ditentukan oleh Platform Platform Windows (atau apa pun yang mereka sebut tahun ini) ketika menargetkan platform 64-bit.

Jadi, jika Anda hanya menyertakan header standar dan tidak mengambil langkah lain untuk mendefinisikannya, WIN64 akan tidak didefinisikan.

Ada cerita yang serupa untuk _WIN32 dan WIN32 - tetapi memeriksa kompiler lain: GCC 3.4.5 tidak mendefinisikan WIN32 meskipun hanya header standar yang digunakan. Seperti halnya Digital Mars.

Compiler Microsoft dan Comeau tidak.

Sedikit lagi (mudah-mudahan) trivia terkenal adalah bahwa _WIN32 dan WIN32 ditetapkan ketika menargetkan platform Windows 64-bit. Terlalu banyak barang akan rusak sebaliknya.


10
2017-10-30 04:41



Kompiler Visual C ++ mendefinisikan makro berikut:

  • _M_IX86 - platform x86
  • _M_IA64 - platform ia64
  • _M_X64 - platform x64

8
2017-10-30 04:05



Periksa properti build proyek Anda, terutama bagian preprocessor. Apakah kamu mendefinisikan _WIN64 suatu tempat di WIN32 membangun? Itu sizeof hal itu mungkin tidak akan berfungsi karena Anda tidak dapat menggunakannya dalam #if uji.


2
2017-10-30 03:59