كيف تحدد الهندسة المعمارية بطريقة محايدة منصة؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

لدي تطبيق C ++ يستخدم WXWidgets. تختلف أجزاء معينة من التطبيق عن مضيفات 32 و 64 بت. حاليا أستخدم SizeOF (void *) ، ولكن هل هناك طريقة أفضل تستخدم تجميعًا مشروطًا وهي محايدة منصة؟

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

المحلول

عادةً ما يستخدم الأشخاص #Defines لتحديد العت (يعتمد تعريف الدقيق على المترجم). هذا أفضل من نهج وقت التشغيل باستخدام sizeof (void*).

أما بالنسبة للمنصة المحايدة ، حسنًا ، بعض المجمعين موجودون على منصات متعددة ..

نصائح أخرى

اعتمادًا على المترجم الخاص بك ، قد يكون بإمكانك الوصول إلى وحدات الماكرو الخاصة بالمنصة. حاول البحث عن وثائقهم.

جميع المترجمين المشتركين لديهم وحدات الماكرو قبل المعالجة المحددة التي تحدد المنصة. على سبيل المثال ، إذا كنت تستخدم GCC ، فيمكنك التحقق منها بسهولة:

touch foo.h; g++ -E -dM foo.h

الذي يعطي من بين آخرين

#define linux 1
#define __x86_64 1

بالنسبة لي ، بما أنني أستخدم Linux 64B في الوقت الحالي ، و

#define __APPLE__ 1
#define __i386 1

على 32B OS X ، أسمع.

بالنسبة لـ Sun Studio 12 ، تم توثيقها هنا. أيضًا ، تعتبرها Sun Microsystems كجزء من واجهة برمجة التطبيقات للمترجم ، لذا يتم ضمان التوافق. على سبيل المثال ، في صندوق Solaris الخاص بي ، لدي __SunOS_5_10 و __sparcv9 محددة (تعني 64 ب).

على أنظمة AIX مع برنامج التحويل البرمجي IBM XLC ، ألق نظرة على /etc/vac.cfg و options حقول الكلمات الرئيسية لمعرفة وحدات الماكرو المحددة مسبقًا. هناك على الأقل _AIX وأكثر تحديدا _AIX61 إلى جانب _POWER (على 64B PPC) محددة على نظام حيث لدي الوصول.

على HP-UX ومترجم ACC ، هناك على الأقل __ia64 ماكرو على إيتانيوم. يتم توثيق بعض وحدات الماكرو المحددة المحددة مسبقًا هنا.

ما الخطأ في استخدام sizeof() أين يهم الحجم؟ سيقوم المترجم بسعادة بتحسينه بعيدًا إلى ثابت.

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