3

アセンブリをインライン化する必要があるマクロを作成する必要があります

#define create_me(name) \
  __asm\
  mov name,#0x1021\
  __endasm\

ただし、 # はコンパイルされていません。パラメータとして渡そうとしましたが、それも機能しません。invalid preprocessor token と表示されます。インライン関数を使用することはできますが、レジスタ名を動的に作成することはできません。つまり、名前変数にアクセスできません。マクロ内で # 操作を使用する方法について何か提案はありますか?

#define マクロで # 記号をエスケープする方法を見てきました。、しかし、ここでマクロが必要な理由を明確に説明しました。私のユースケースは異なります。

4

4 に答える 4

6

別のマクロを介して間接化を使用すると、うまくいくはずです。

#define HASH_LIT #
#define HASH() HASH_LIT

#define create_me(name) \
  __asm\
  mov name,HASH()0x1021\
  __endasm
于 2016-07-07T12:12:30.450 に答える
0

問題の性質を理解するのに役立ちます。シンボルは、次の#3 つの点でプリプロセッサにとって特別です。

  1. 最初の前処理トークンが であるソース行は#、プリプロセッサによって「テキスト行」ではないと認識されます。つまり、プリプロセッサ用の命令が含まれています。一方、テキスト行は処理対象のデータです。大部分は C プログラム ソースですが、展開するマクロが含まれている可能性があります。は#、行の最初の前処理トークンでない場合、この意味で特別ではありません。

  2. 関数のようなマクロの置換リストの前処理トークンのうち、トークン#は文字列化演算子です。ただし、変数のようなマクロでは、また、マクロ展開されたテキストがさらにマクロ置換のために再スキャンされる場合にも、その目的には役立ちません。

  3. 関数のようなマクロの置換リストの前処理トークンのうち、トークン##はトークンの貼り付け演算子です。ただし、変数のようなマクロでは、また、マクロ展開されたテキストがさらにマクロ置換のために再スキャンされる場合にも、その目的には役立ちません。

#の重要性をプリプロセッサ自体に逃れることはできませんが、@Quentin が示したように、少し間接的に使用することで目的のマクロを実装できます。そもそも、a#が関数のようなマクロの展開に現れる場合、そのマクロの置換テキストに直接現れることはできず、文字列化演算子として解釈されます。代わりに、別のマクロを展開して導入する必要があります。第 2 に、間に空白を入れずに他のテキストに隣接させなければならない場合、それに展開される直接のマクロは関数のようなマクロ自体でなければならないため、括弧は隣接するテキストからマクロ名を分離する役割を果たします。これには、第 2 レベルの間接化が必要です。

于 2016-07-07T13:50:05.723 に答える