C++ 如何在C++;宏或如何使用C++;模板也要这样做吗?

C++ 如何在C++;宏或如何使用C++;模板也要这样做吗?,c++,assembly,arm,c-preprocessor,realview,C++,Assembly,Arm,C Preprocessor,Realview,我看到了以下问题: 让我简要介绍一下C++预处理器中的新行的需求。在一个使用C++代码的嵌入式汇编代码的代码上,在ARM RealVIEW编译器3.1上工作。 #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 vThu

我看到了以下问题:

让我简要介绍一下C++预处理器中的新行的需求。在一个使用C++代码的嵌入式汇编代码的代码上,在ARM RealVIEW编译器3.1上工作。

#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中没有类似asm volatile的API

DEFINE_函数宏用于很多地方,因此也不能忽略它

因此,在最后的选择中,考虑以下解决方案:

  • 使用M4预处理器代替C++预处理器
  • 使用C++模板实现此方法,并使用GRIP/SED
  • 替换定义函数
有人能给我指点或方法来做上述事情吗?我不能使用ARM Realview编译器3.1以外的任何编译器

我需要一些像下面这样的扩展,为,
定义函数(void*,mov\u 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
  }

您的示例非常混乱,但这不管用吗

#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
 }

这正是您所要求的。

我使用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++编译器中,确实存在一个良好的宏预处理器的范围。

< P>每个版本都有不同的换行字符。 e、 g.AVR已经$
寻找ARM气体版本

的字符,如果你使用C++代替CPP,那么它就不会那么混乱了,因为后者也代表C预处理器。谢谢通知!!不,这不会在
\u asm
块中添加换行符。通过gcc-E运行它。哦,我明白你的意思了。是的,我不知道如何使cpp做到这一点。这将不起作用,预处理器将删除\之后的换行符