كيفية تضمين سطر جديد في ماكرو C ++ أو كيفية استخدام قوالب C ++ للقيام بنفس الشيء؟

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

سؤال

رأيت السؤال التالي:كيفية توليد خط جديد في ماكرو CPP؟

اسمحوا لي أن أعطي متطلبات موجزة للحاجة في NewLine في معالج C ++. أنا أعمل على ARM Realview Compiler 3.1 على رمز يستخدم رمز التجميع المضمن مع رمز C ++.

#define DEFINE_FUNCTION(rtype, op, val) \
    __asm rtype nt_##op(void*) { \   
      str lr, [sp, ##val];bl vThunk_##op;ldr lr, [sp,##val];bx lr; \
    } \
   void vThunk_##op(void*)

DEFINE_FUNCTION(void*, mov_lt, #0x04)
{
     // do some operation
}

يعلن الماكرو أعلاه عن وظيفة التجميع المدمجة التي تتطلب بقوة خط جديد بين كل عبارات في جسم الوظيفة.

أعتقد أن هذا يرجع إلى أن النص في الوظيفة يتم إرساله بشكل أعمى إلى Arm Armbler بواسطة برنامج التحويل البرمجي للذراع.

لماذا لا يزال C ++ Preprocessors الآن لا يدعم بدائل متعددة الخطوط؟ وأيضًا لا يمكنني استخدام # في سلسلة الاستبدال. على سبيل المثال ، لهذا النوع من التجميع ،

str lr, [sp, #0x04]

لقد جربت الكثير من الأساليب والطرق ، لكن لا شيء يعمل حقًا. Arm Armbler/برنامج التحويل البرمجي أساسي لدرجة أنه لا يوجد واجهة برمجة تطبيقات مثل ASM متقلبة في مجلس التعاون الخليجي.

يتم استخدام macro define_function في الكثير من الأماكن ، لذلك لا يمكن تجاهله أيضًا.

لذلك ، في المنتجع النهائي التفكير في الحلول التالية:

  • باستخدام المعالج المسبق M4 بدلاً من C ++ Preprocesser
  • استخدم قوالب C ++ لتحقيق ذلك بطريقة أو بأخرى واستبدال define_function باستخدام grep/sed

هل يمكن لأي شخص أن يعطيني مؤشرات أو طرق للقيام بالأشياء المذكورة أعلاه؟ لا يمكنني استخدام أي برنامج التحويل البرمجي بخلاف ARM Realview Compiler 3.1.

أحتاج إلى بعض التوسع كما يلي مع خط جديد ل ، DEFINE_FUNCTION(void*, mov_lt, #0x04) {},

__asm void* nt_mov_lt(void*) {   
      str lr, [sp, 0x04];
      bl vThunk_mov_lt;
      ldr lr, [sp,0x04];
      bx lr;
    }
 void vThunk_mov_lt(void*)
 {
     // do something
  }
هل كانت مفيدة؟

المحلول

لقد حلت المشكلة أعلاه باستخدام معالج GNU M4 بنجاح.

m4_define('DEFINE_FUNCTION','
     __asm rtype nt_$2(void*) {  
      str lr, [sp, $3];
      bl vThunk_$1;
      ldr lr, [sp,$3];
      bx lr;
    } 
   void vThunk_$2(void*)')

DEFINE_FUNCTION(void*, mov_lt, 0x04)
{
}

معالجة الرمز أعلاه باستخدام M4 حل مشكلتي لمتطلبات الخط الجديد في الكود. RAN M4 -P كحدث prebuild بحيث تتم معالجة هذا الملف المصدر حتى قبل CERCOSSER C وترجم مرحلة التجميع في الصورة.

شكرا للمساعدة وآسف على إرباك الكثير. ولكن هناك حقًا مجال للمعالجة المسبقة الماكرو في أحدث مجمعات C ++.

نصائح أخرى

كل إصدار من الغاز له حرف جديد بديل ، مثل AVR لديه $ يبحث عن شخصية نسخة غاز الذراع

مثالك مربك للغاية ، لكن أليس هذا العمل؟

#define DEFINE_FUNCTION(rtype, op, val) \
    __asm rtype nt_##op(void*) { \   
      str lr, [sp, val];\
      bl vThunk_##op;\
      ldr lr, [sp,val];\
      bx lr;\
    }\
   void vThunk_##op(void*)

وعندما تسمى مثل

DEFINE_FUNCTION(void*, mov_lt, 0x04)  // notice no # here
{
     // do some operation
}

ستحصل عليها

__asm void* nt_mov_lt(void*) {   
      str lr, [sp, 0x04];
      bl vThunk_mov_lt;
      ldr lr, [sp,0x04];
      bx lr;
    }
 void vThunk_mov_lt(void*)
 {
     // do something
 }

وهذا بالضبط ما تطلبه.

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