私はopensourceプロジェクトのコードサンプルを参照していますtigどちらが素晴らしいツールです!マクロでEnum/Structを定義する必要はありますか?
ファイル:tig.c私は次のように要求列挙を定義するための理由を見つけるのに苦労しています
:
enum request {
#define REQ_GROUP(help)
#define REQ_(req, help) REQ_##req
/* Offset all requests to avoid conflicts with ncurses getch values. */
REQ_UNKNOWN = KEY_MAX + 1,
REQ_OFFSET,
REQ_INFO,
/* Internal requests. */
REQ_JUMP_COMMIT,
#undef REQ_GROUP
#undef REQ_
};
さえ構造を、同様..
static const struct request_info req_info[] = {
#define REQ_GROUP(help) { 0, NULL, 0, (help) },
#define REQ_(req, help) { REQ_##req, (#req), STRING_SIZE(#req), (help) }
REQ_INFO
#undef REQ_GROUP
#undef REQ_
};
見ることができるようにREQ_GROUP
は複数回#定義されています。よく私はそのような理由があるかもしれないことを知っている..マクロを使用してコード内の列挙体/構造体の定義を隠す実際の理由は何ですか?
何が起こっているのか理解するために、前処理されたソースとなるgccオプション '-dNI -E'を使ってソースをコンパイルすると便利ですが、マクロは展開されずに'#include'文はそのままです。 –
以下の答えがあります。この戦略の一般的な名前は "Xマクロ"、ウィキペディアにはそのページがあります:http://en.wikipedia.org/wiki/X_Macro Dr Dobbsも同様です:http://www.drdobbs.com/cpp/the -x-macro/228700289 – Vicky
@Vicky drdobbsリンクは宝石でした!ありがとう! – ashishsony