كيف يمكنني الكشف عن إذا أنا تجميع للبنية 64bits في C ++

StackOverflow https://stackoverflow.com/questions/163058

  •  03-07-2019
  •  | 
  •  

سؤال

في وظيفة C ++ أنا في حاجة إلى مترجم لاختيار كتلة مختلفة إذا كان تجميع لبنية 64 بت.

وأنا أعرف طريقة للقيام بذلك لMSVC ++ و g ++، لذلك أنا ما بعد أنها جوابا. ولكن أود أن أعرف إذا كان هناك طريقة أفضل (أكثر أناقة من شأنها أن تعمل لجميع المجمعين / كل بت أبنية 64). إذا لم يكن هناك طريقة أفضل، ما غيرها حدات الماكرو المعرفة مسبقا يجب أن ننظر لللكي تكون متوافقة مع المترجم / أبنية أخرى؟

هل كانت مفيدة؟

المحلول

لماذا اختيار كتلة واحد على الآخر؟ إذا كان يستند قرارك على حجم مؤشر، استخدم sizeof(void*) == 8. إذا كان يستند قرارك على حجم عدد صحيح، استخدم sizeof(int) == 8.

وجهة نظري هو أن اسم العمارة نفسها أن نادرا ما يحدث أي فرق. يمكنك الاختيار فقط ما تحتاج إلى التحقق، لأغراض ما كنت تنوي القيام به. لا يغطي سؤالك بشكل واضح جدا ما غرضك من الشيك. ما كنت طالبا هو أقرب إلى محاولة لتحديد ما إذا تم تثبيت دايركت عن طريق الاستعلام عن نسخة من ويندوز. لديك المزيد من الأدوات المحمولة والعامة تحت تصرفكم.

نصائح أخرى

ووسيلة مستقلة للكشف عن الهندسة المعمارية 32 بت و 64 بت يبني في C و C ++ تبدو مثل هذا:

// C
#include <stdint.h>

// C++
#include <cstdint>

#if INTPTR_MAX == INT64_MAX
// 64-bit
#elif INTPTR_MAX == INT32_MAX
// 32-bit
#else
#error Unknown pointer size or missing size macros!
#endif

وهذا يعمل لMSVC ++ و g ++:

#if defined(_M_X64) || defined(__amd64__)
  // code...
#endif
#ifdef _LP64

ويعمل على كل المنابر

وفيما يلي لمحة جيدة لنظام التشغيل Mac OS X:

http://developer.apple.com/documentation/Darwin/Conceptual/64bitPorting

إذا كنت تجميع للمنصة ويندوز، يجب عليك استخدام:

#ifdef _WIN64

ويعرف المترجم MSVC أن لكل من منصات x64 و IA64 (كنت لا تريد قطع إلى أن السوق، أليس كذلك؟). أنا لست متأكدا مما اذا كان دول مجلس التعاون الخليجي يفعل نفس الشيء - ولكن ينبغي إذا لم يحدث ذلك

.

وبديل ذلك هو

#ifdef WIN64

والتي لديها فرق دقيق. ويعرف WIN64 (بدون تسطير الرائدة) من قبل SDK (أو تكوين بناء). منذ يعرف هذا من قبل SDK / بناء التكوين، فإنه يجب أن تعمل فقط كذلك مع دول مجلس التعاون الخليجي.

إذا باستخدام ويندوز الخاص بك، بشكل أفضل على الأرجح للحصول على "PROCESSOR_ARCHITECTURE" متغير البيئة من التسجيل لsizeof (PVOID) ويساوي 4 إذا به في عملية 32BIT والتي تعمل على نظام 64BIT التشغيل (ويعرف أيضا باسم WOW64):

    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SYSTEM\CurrentControlSet\\Control\\Session Manager\\Environment"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
        LPSTR szArch = new CHAR[100];

        ZeroMemory(szArch, 100);

        if (RegQueryValueEx(hKey, _T("PROCESSOR_ARCHITECTURE"), NULL, NULL, (LPBYTE)szArch, &dwSize) == ERROR_SUCCESS) {
            if (strcmp(szArch, "AMD64") == 0)
                this->nArchitecture = 64;
            else
                this->nArchitecture = 32;
        } else {
            this->nArchitecture = (sizeof(PVOID) == 4 ? 32 : 64);
        }

        RegCloseKey(hKey);
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top