私はこのcプリプロセッサステートメントの意味について少し迷っています、
-
11-10-2019 - |
質問
したがって、開始するために、ここにコードがあります。実際の名前は、一般的な名前が混乱を制限するために切り替えられます。
/* Get the list of Hotkey commands */
#define A_COMMANDS_MACRO(a, b, c, d) a = b ,
enum {
#include "commandsFile.def"
} ;
#undef A_COMMANDS_MACRO
これは、私が見てきたいくつかのソースコードからのスニペットです。 c プログラミング言語。だから、私の訓練されていない目には、これは何もしないようです。私の脳には、何かを定義し、すぐに定義することは、お互いをキャンセルするように思われます。
明らかに、私は自分が間違っていることに気付きます。しかし、なぜ私は間違っているのですか?
解決
通常、X-Macroと呼ばれます。この手法は、マクロを介して定義することで構成されています #define
, 、そして、それらを使用するファイルを含む #include
.
非常に簡単な例として、ヘッダーを持つことができます(たとえば myheader.h)次の形式で2つの関数を宣言しました。
int foo(MYTYPE a, MYTYPE_PTR b);
void bar(MYTYPE a, MYTYPE_PTR b);
そして、あなたのコードで:
#define MYTYPE int
#define MYTYPE_PTR int*
#include "myheader.h"
#undef MYTYPE
#undef MYTYPE_PTR
#undef
sは、含まれているファイルにも含まれることがあります。
詳細については、ご覧ください このウィキペディアリンクで.
他のヒント
「commandsfile.def」ファイルは、おそらく「a_commands_macro」マクロをどこかで内部で使用します。
「#include」は本質的に含まれたファイルを含めるファイルに貼り付けることに注意してください。したがって、#defineは「commandsfile.def」が処理されたときにまだ有効です。
commandsFile.def
多くの行を含める必要があります:
A_COMMANDS_MACRO(A_COMMAND, 10, na, na)
A_COMMANDS_MACRO(OTHER_COMMAND, 23, na, na)
コードが利用可能なコマンドとそのコードを含む列挙を作成するようにします。
この.defファイルが他の言語で記述されたプログラムで使用される場合に役立つ可能性があります。そのため、テキストの解析を実装する代わりに、これを行うためにC preprocessorを使用します。