如何在 C++ 宏中包含换行符或如何使用 C++ 模板来执行相同操作?
-
20-09-2019 - |
题
我看到了以下问题:如何在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 中没有像 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++ 编译器中确实存在良好的宏预处理器的空间。
其他提示
每个气体版本都有不同的newline替换字符,例如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
}
这正是你所要求的。
不隶属于 StackOverflow