1

いくつかの C++ コードを読んで、大まかに次のように関数マクロの「機能的」使用法と呼ぶものに出くわしました (これは、要点を明確にするために完全に様式化された例です)。

#define TOP_LEVEL(ARG1)     \
ARG1("foo1","bar1")     \
ARG1("foo2","bar2")

#define NEXT_LEVEL(ARG2A, ARG2B)    \
cout << ARG2A << " and " << ARG2B;

TOP_LEVEL(NEXT_LEVEL)

私はこの言語に比較的慣れていないため、最初はこれを理解できませんでしたが、プリプロセッサ ( g++ -E) だけを実行したところ、次のように解決されました。

cout << "foo1" << " and " << "bar1"; cout << "foo2" << " and " << "bar2";

そこで何をしたか分かりますか?マクロ TOP_LEVELへの関数ポインターのように、マクロ NEXT_LEVEL を渡しました。これがどれほど役立つ可能性があるかを見て、私はそれについてもっと学びたいと思いました.

しかし、大量のグーグル検索にもかかわらず、ドキュメントに近づくものは言うまでもなく、プリプロセッサのこの機能が存在するという証拠 さえ見つけることできませ。最後には「高度なマクロのトリック」と呼ばれるセクションさえあります-確かにこれは資格があります!?

(これは、別の評価された関数マクロを引数として単純に関数マクロを呼び出すのとはまったく異なることに注意してください。 FOO(BAR(2)) の方がはるかに簡単です。)

私の質問は次のとおりです。

  • この動作の実際の名前はありますか?
  • それはどこかに文書化されていますか?
  • それは一般的に使用されていますか、それともよく知られている落とし穴などはありますか?
4

2 に答える 2