Как включить перевод строки в макрос C ++ или как использовать шаблоны C ++ для выполнения того же?

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

Вопрос

Я увидел следующий вопрос:Как сгенерировать новую строку в макро cpp?

Позвольте мне привести краткое требование о необходимости перевода строки в препроцессоре C ++.Я работаю над компилятором ARM Realview 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 на ассемблер ARM.

Почему препроцессор C ++ по-прежнему не поддерживает многострочные замены ?а также я не могу использовать # в строке замены.например, для такого рода сборки,

str lr, [sp, #0x04]

Я перепробовал множество методов и способов, но ничего по-настоящему не получалось.Ассемблер / компилятор ARM настолько прост, что в GCC нет API, подобного asm volatile.

Макрос DEFINE_FUNCTION используется во многих местах, поэтому его также нельзя игнорировать.

Итак, в конечном итоге подумайте о следующих решениях:

  • Использование препроцессора m4 вместо препроцессора C ++
  • Используйте шаблоны 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 решила мою проблему с требованием перевода строки в коде.Запустил m4 -P как событие предварительной сборки, чтобы исходный файл обрабатывался еще до того, как появится препроцессор C и этап компиляции.

Спасибо за помощь и извините, что сильно запутал.Но в последних компиляторах C ++ действительно есть возможности для хорошего препроцессора макросов.

Другие советы

каждая версия gas имеет свой символ замены новой строки напримерВ AVR есть $ найдите символ для версии ARM gas

Ваш пример чрезвычайно запутан, но разве это не сработало бы?

#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