كيف تحدد الهندسة المعمارية بطريقة محايدة منصة؟
سؤال
لدي تطبيق 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()
أين يهم الحجم؟ سيقوم المترجم بسعادة بتحسينه بعيدًا إلى ثابت.