كيف يمكنني الكشف عن إذا أنا تجميع للبنية 64bits في C ++
-
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);
}