я увидел следующий вопрос:
Как создать новую строку в макросе 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 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
}