私は次の質問を見ました: cppマクロで改行を生成する方法は?
C++プリプロセッサの改行の必要性について簡単に説明します。C++コードで埋め込みアセンブリコードを使用するコードでARMRealviewコンパイラ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にはasmvolatileのようなAPIはありません。
DEFINE_FUNCTIONマクロは多くの場所で使用されているため、無視することもできません。
したがって、最終的な手段として、次の解決策について考えます。
- C++プリプロセッサの代わりにm4プリプロセッサを使用する
- C ++テンプレートを使用してこれを何らかの方法で実現し、grep/sedを使用してDEFINE_FUNCTIONを置き換えます
誰かが私に上記のことをするための指針や方法を教えてもらえますか?ARMRealviewコンパイラ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
}