c++ - 如何在 C++ 宏中包含换行符或如何使用 C++ 模板来做同样的事情?

标签 c++ arm c-preprocessor inline-assembly realview

我看到了下面的问题: How to generate a newline in a cpp macro?

让我简要介绍一下 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 中没有像 asm volatile 这样的 API。

DEFINE_FUNCTION宏在很多地方用到,所以也不能忽略。

因此,最终考虑以下解决方案:

  • 使用 m4 预处理器代替 C++ 预处理器
  • 使用 C++ 模板以某种方式实现此目的并使用 grep/sed 替换 DEFINE_FUNCTION

任何人都可以给我指点或方法来做上述事情吗?除了 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
  }

最佳答案

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

关于c++ - 如何在 C++ 宏中包含换行符或如何使用 C++ 模板来做同样的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1548017/

相关文章:

c++ - 如何使用 Marching Squares 生成位图的多边形网格?

c++ - 为本地安装的 Protocol Buffer 配置 CMakeLists.txt

linux - Linux内核中ASID用完了怎么处理?

openssl - 在裸机上交叉编译 openssl

c++ - 是否可以在 ARM Windows 主机上本地编译 ARM Windows C++ 软件?

c - 如何在 C 中使用 ## 实现循环

c++ - 我可以解开 GCC 的 RTTI 名称吗?

c++ - 为什么在创建数组期间在 C++ 中抛出未捕获的异常时不调用析构函数?

c - 使用预处理器在 C 中进行模板化

C 预处理器 : Own implementation for __COUNTER__