マクロトリック...
C マクロでループを展開したい場合は、繰り返しと同じ数のマクロが必要です (プリプロセッサを使用すると、ファイルを再帰的にインクルードして他のトリックを実行することもできますが、マクロのようなインターフェイスはありません)。
エンドマーカーを追加しましたが、本当に必要かどうかはわかりません。
マクロ名を作成することにより、空の終了マクロまたは継続マクロのいずれかにディスパッチします。
したがって、ここでは、変更されたインターフェイスと最大 4 つのオブジェクトを使用して、必要なことを行うものを示します。より多くのオブジェクトに同様のマクロを追加するだけです。
#define TYPE_DEF_OBJECT(name, class, constructor_params) \
typedef class name ## type; \
name ## type* name;
#define TYPE_DEF_END(name, class, constructor_params)
#define TYPE4_OBJECT(name, class, constructor_params) \
TYPE_DEF_OBJECT(name, class, constructor_params) TYPE5
#define TYPE4_END(name, class, constructor_params) \
TYPE_DEF_END(name, class, constructor_params)
#define TYPE4(kind, name, class, constr) \
TYPE4_##kind(name, class, constr)
#define TYPE3_OBJECT(name, class, constructor_params) \
TYPE_DEF_OBJECT(name, class, constructor_params) TYPE4
#define TYPE3_END(name, class, constructor_params) \
TYPE_DEF_END(name, class, constructor_params)
#define TYPE3(kind, name, class, constr) \
TYPE3_##kind(name, class, constr)
#define TYPE2_OBJECT(name, class, constructor_params) \
TYPE_DEF_OBJECT(name, class, constructor_params) TYPE3
#define TYPE2_END(name, class, constructor_params) \
TYPE_DEF_END(name, class, constructor_params)
#define TYPE2(kind, name, class, constr) \
TYPE2_##kind(name, class, constr)
#define TYPE1_OBJECT(name, class, constructor_params) \
TYPE_DEF_OBJECT(name, class, constructor_params) TYPE2
#define TYPE1_END(name, class, constructor_params) \
TYPE_DEF_END(name, class, constructor_params)
#define TYPE1(kind, name, class, constr) \
TYPE1_##kind(name, class, constr)
#define TYPE0_OBJECT(name, class, constructor_params) \
TYPE_DEF_OBJECT(name, class, constructor_params) TYPE1
#define TYPE0_END(name, class, constructor_params) \
TYPE_DEF_END(name, class, constructor_params)
#define TYPE(kind, name, class, constr) \
TYPE0_##kind(name, class, constr)
#define RUN_DEF_OBJECT(name, class, constructor_params) \
name ## type* name = new name##type constructor_params;
#define RUN_DEF_END(name, class, constructor_params)
#define RUN4_OBJECT(name, class, constructor_params) \
RUN_DEF_OBJECT(name, class, constructor_params) RUN5
#define RUN4_END(name, class, constructor_params) \
RUN_DEF_END(name, class, constructor_params)
#define RUN4(kind, name, class, constr) \
RUN4_##kind(name, class, constr)
#define RUN3_OBJECT(name, class, constructor_params) \
RUN_DEF_OBJECT(name, class, constructor_params) RUN4
#define RUN3_END(name, class, constructor_params) \
RUN_DEF_END(name, class, constructor_params)
#define RUN3(kind, name, class, constr) \
RUN3_##kind(name, class, constr)
#define RUN2_OBJECT(name, class, constructor_params) \
RUN_DEF_OBJECT(name, class, constructor_params) RUN3
#define RUN2_END(name, class, constructor_params) \
RUN_DEF_END(name, class, constructor_params)
#define RUN2(kind, name, class, constr) \
RUN2_##kind(name, class, constr)
#define RUN1_OBJECT(name, class, constructor_params) \
RUN_DEF_OBJECT(name, class, constructor_params) RUN2
#define RUN1_END(name, class, constructor_params) \
RUN_DEF_END(name, class, constructor_params)
#define RUN1(kind, name, class, constr) \
RUN1_##kind(name, class, constr)
#define RUN0_OBJECT(name, class, constructor_params) \
RUN_DEF_OBJECT(name, class, constructor_params) RUN1
#define RUN0_END(name, class, constructor_params) \
RUN_DEF_END(name, class, constructor_params)
#define RUN(kind, name, class, constr) \
RUN0_##kind(name, class, constr)
#define DEF_OBJECTS(definitions) \
TYPE definitions \
RUN definitions \
DEF_OBJECTS(
(OBJECT, Object1, CClass1, ("par1"))
(END, , , )
)