他の人が言うように、いいえ、マクロ内に #include ステートメントを含めることはできません。プリプロセッサは 1 つのパスしか実行しないためです。ただし、最近使用していることに気付いた危険なトリックを使用して、プリプロセッサに基本的に同じことをさせることができます。
プリプロセッサ ディレクティブは、マクロ内では何も実行しませんが、ファイル内では実行することに注意してください。したがって、変更したいコードのブロックをファイルに貼り付け、それをマクロ定義のように考えて (他のマクロによって変更できる部分を含む)、この疑似マクロ ファイルをさまざまな場所に #include することができます (makeインクルードガードがないことを確認してください!)。#include は基本的にあるファイルの内容を別のファイルにダンプするだけなので、マクロとまったく同じようには動作しませんが、かなりマクロに似た結果を得ることができます。
たとえば、グループに含まれる類似した名前のヘッダーを多数含めることを検討してください。それらをすべて書き出すのは面倒ですし、自動生成されることさえあります。次のようなことを行うことで、それらの組み込みを部分的に自動化できます。
ヘルパー マクロ ヘッダー:
/* tools.hpp */
#ifndef __TOOLS_HPP__
#def __TOOLS_HPP__
// Macro for adding quotes
#define STRINGIFY(X) STRINGIFY2(X)
#define STRINGIFY2(X) #X
// Macros for concatenating tokens
#define CAT(X,Y) CAT2(X,Y)
#define CAT2(X,Y) X##Y
#define CAT_2 CAT
#define CAT_3(X,Y,Z) CAT(X,CAT(Y,Z))
#define CAT_4(A,X,Y,Z) CAT(A,CAT_3(X,Y,Z))
// etc...
#endif
疑似マクロファイル
/* pseudomacro.hpp */
#include "tools.hpp"
// NO INCLUDE GUARD ON PURPOSE
// Note especially FOO, which we can #define before #include-ing this file,
// in order to alter which files it will in turn #include.
// FOO fulfils the role of "parameter" in this pseudo-macro.
#define INCLUDE_FILE(HEAD,TAIL) STRINGIFY( CAT_3(HEAD,FOO,TAIL) )
#include INCLUDE_FILE(head1,tail1.hpp) // expands to #head1FOOtail1.hpp
#include INCLUDE_FILE(head2,tail2.hpp)
#include INCLUDE_FILE(head3,tail3.hpp)
#include INCLUDE_FILE(head4,tail4.hpp)
// etc..
#undef INCLUDE_FILE
ソースファイル
/* mainfile.cpp */
// Here we automate the including of groups of similarly named files
#define FOO _groupA_
#include "pseudomacro.hpp"
// "expands" to:
// #include "head1_groupA_tail1.hpp"
// #include "head2_groupA_tail2.hpp"
// #include "head3_groupA_tail3.hpp"
// #include "head4_groupA_tail4.hpp"
#undef FOO
#define FOO _groupB_
#include "pseudomacro.hpp"
// "expands" to:
// #include "head1_groupB_tail1.hpp"
// #include "head2_groupB_tail2.hpp"
// #include "head3_groupB_tail3.hpp"
// #include "head4_groupB_tail4.hpp"
#undef FOO
#define FOO _groupC_
#include "pseudomacro.hpp"
#undef FOO
// etc.
これらのインクルードは、Bing Jian の要求による回答として、繰り返したいコード ブロックの途中にある可能性もあります (FOO が変更されています): #include ディレクティブを含むマクロ定義
私はこのトリックを広範囲に使用したことはありませんが、これで私の仕事は完了です。明らかに、必要な数の「パラメーター」を持つように拡張でき、そこで好きなプリプロセッサー コマンドを実行して、実際のコードを生成できます。マクロ内にインクルードを貼り付けることができないため、通常のマクロのように、作成したものを別のマクロへの入力として使用することはできません。しかし、それは別の疑似マクロの中に入ることができます:)。
他の人は、他の制限、および何がうまくいかないかについてコメントするかもしれません:)。