私はこのようなマクロを持っていると仮定します
#define MY_MACRO(n) xxxxxxxxx // some code
それなら何度も使いたい
MY_MACRO(0)
MY_MACRO(1)
MY_MACRO(2)
MY_MACRO(3)
...
MY_MACRO(100)
これを行うためのより良い方法はありますか?(マクロを使用する必要があります)
反復を使用できます。ブーストのプリプロセッサ ライブラリを使用するか、独自のライブラリを作成できます。後者で頑張ってください...それは非常に複雑です。プリプロセッサのメタプログラミングはトリッキーな仕事です。
ブースト プリプロセッサを使用すると、次のようになります。
#define MY_MACRO_N(Z,N,D) MY_MACRO(N)
BOOST_PP_REPEAT(101, MY_MACRO_N, ~)
次のようなことができます。
int i;
for (i = 0; i <= 100; i++)
MY_MACRO(i);
このループを使用すると、 ( to )MY_MACRO(n)
の現在の値で 101 回呼び出されることになります。i
0
100
絶対に絶対に絶対にマクロを使うなと言っている高学歴の理論家の批評家のことは忘れてください!
マクロは確かに必要悪です。はい、テンプレート、ポリモーフィズムなど、他のオプションがある場合もあります。しかし、マクロを使用せずに繰り返しから解放できるとは限りません。
そして、私の謙虚な意見では、マクロは、同じことを際限なく書き直すよりも優れた代替手段です。
今あなたの質問について。マクロが実行時のパラメーターである可能性がある式に評価される場合は、ループを使用できます。
マクロがコンパイル時の既知の定数を必要とする場合は、テンプレートの使用を検討してください (該当する場合)。
マクロが数値定数である式を要求する場合、代替手段はありません。
私が提案できるのは、実際にマクロを 100 回繰り返す代わりに、次のようないくつかのトリックを行うことです。
#define MACRO_IX10(m, i) \
m(i##0) \
m(i##1) \
m(i##2) \
m(i##3) \
m(i##4) \
m(i##5) \
m(i##6) \
m(i##7) \
m(i##8) \
m(i##9)
#define MACRO_IX100(m) \
MACRO_IX10(m, ) \
MACRO_IX10(m, 1) \
MACRO_IX10(m, 2) \
MACRO_IX10(m, 3) \
MACRO_IX10(m, 4) \
MACRO_IX10(m, 5) \
MACRO_IX10(m, 6) \
MACRO_IX10(m, 7) \
MACRO_IX10(m, 8) \
MACRO_IX10(m, 9)
次に、これを行うことができます:
MACRO_IX100(MYMACRO)
これは、適切な式を使用してマクロを 100 回呼び出すことに相当します。