سؤال

أنا أعمل مع رمز C المضمن الذي يحدد الأنواع uint8_t, uint16_t و uint32_t في ملف رأس باستخدام typedef الكلمة الرئيسية.

للمناقشة ، دعنا نقول الملف typedefs.h يحتوي على هذه التعريفات.

في وحدة مصدر C الجديدة الخاصة بي ، أدرج stdint.h. أقوم أيضًا بتضمين ملفات رأس أخرى تتضمن typedefs.h في مكان ما في التسلسل الهرمي. كما هو متوقع ، يشكو المترجم من رموز متعددة محددة.

أود تعديل الملف القديم typedefs.h بحيث تعلن فقط uint*_t الأنواع إذا stdint.h غير متضمن أو أفضل إذا كان uint*_t لم يتم تعريف الأنواع.

أفهم ذلك #ifndef لا يمكن استخدامه منذ typedef ليس توجيها قبل المعالج.

فكيف أخبر المترجم بعدم تحديد uint*_t إذا كانت موجودة بالفعل (أو إذا stdint.h تم تضمينه بالفعل)؟

ملاحظة: سيكون هذا سهلاً إذا تشمل المعيار المحدد لمواصفات C تعريفات الحراسة لملفات الرأس.

FWIW ، أنا أستخدم Green Hills Compiler ، 4.24 ، لمعالج ARM9.

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

المحلول

فقط قم بإصلاح الرأس القديم لتضمينه دائمًا stdint.h للحصول على هذه الأنواع ، قم بإزالة التعريفات المكررة ، وتوفير ملف إسقاط stdint.h للأنظمة المكسورة التي تفتقر إليها.

نصائح أخرى

أنا أعتقد أن stdint.h يجب أيضًا تحديد ماكرو لحدود الأنواع التي تحددها. يجب أن تكون قادرًا على اختبار أولئك الذين يستخدمون #ifdef وما شابه ذلك.

#ifndef UINT32_MAX
  typdef ... uint32_t;
  #define UINT32_MAX ...
  ...
#endif

تحرير: تم استخدامه في الأصل UINT32_MIN ، ولكن كما Jens Gustedt Out هذا هو مزيج واحد من التوقيع/غير موقّع و MIN/MAX الذي لا يحدث.

إذا كنت على نظام UNIX ، فيجب عليك النسخ الاحتياطي لخطوة واستخدام حزمة تكوين مثل AutoconF (1) أو Automake (1). إنه مصمم للتعامل مع مشاكل مثل هذا.

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