私は@Olafに同意します:機能が使用できるマクロは使用しないでください。 しかし時々状況や欲求がその考えを覆してしまいます。
プリプロセッサは時には正しい場所に適切な数の迂回を望んでいるので、これを得るまで実験しました。私は、私が予測することができなかったことを認めて、少なくとも、面白い、自明ではない部分について、詳しく説明することはできません。
#define DIM 2
#define CONCAT(x,y,a,b) x ## y(a,b)
#define DOT_PRODUCT_DIM(y,a,b) CONCAT(DOT_PRODUCT_,y,a,b)
#define MULTIPLY(a, b) ((a)*(b))
#define DOT_PRODUCT_2(a, b) ( MULTIPLY((a)[0],(b)[0]) + \
MULTIPLY((a)[1],(b)[1]))
#define DOT_PRODUCT_3(a, b) ( MULTIPLY((a)[0],(b)[0]) + \
MULTIPLY((a)[1],(b)[1]) + \
MULTIPLY((a)[2],(b)[2]))
#define DOT_PRODUCT_4(a, b) ( MULTIPLY((a)[0],(b)[0]) + \
MULTIPLY((a)[1],(b)[1]) + \
MULTIPLY((a)[2],(b)[2]) + \
MULTIPLY((a)[3],(b)[3]))
#define DOT_PRODUCT(a,b) DOT_PRODUCT_DIM(DIM,a,b)
DOT_PRODUCT_DIM(2,a,b)
DOT_PRODUCT_DIM(3,a,b)
DOT_PRODUCT_DIM(4,a,b)
DOT_PRODUCT_DIM(DIM,a,b)
DOT_PRODUCT(a,b)
OUTPUT(gcc -E Toy.c
)のみ#define DIM 4
を変更した後
((((a)[0])*((b)[0])) + (((a)[1])*((b)[1])) + (((a)[2])*((b)[2])))
((((a)[0])*((b)[0])) + (((a)[1])*((b)[1])) + (((a)[2])*((b)[2])))
OUTPUT((出力の最後の2行を引用のみ#define DIM 3
を変更した後、)
((((a)[0])*((b)[0])) + (((a)[1])*((b)[1])))
((((a)[0])*((b)[0])) + (((a)[1])*((b)[1])) + (((a)[2])*((b)[2])))
((((a)[0])*((b)[0])) + (((a)[1])*((b)[1])) + (((a)[2])*((b)[2])) + (((a)[3])*((b)[3])))
((((a)[0])*((b)[0])) + (((a)[1])*((b)[1])))
((((a)[0])*((b)[0])) + (((a)[1])*((b)[1])))
OUTPUT出力の最後の2行のみを引用する):
((((a)[0])*((b)[0])) + (((a)[1])*((b)[1])) + (((a)[2])*((b)[2])) + (((a)[3])*((b)[3])))
((((a)[0])*((b)[0])) + (((a)[1])*((b)[1])) + (((a)[2])*((b)[2])) + (((a)[3])*((b)[3])))
(出力のみの最後の2行引用のみ#define DIM 5
を変更した後、)OUTPUT:もちろん
DOT_PRODUCT_5(a,b)
DOT_PRODUCT_5(a,b)
、定義されなければならないDOT_PRODUCT_number()
中間マクロを。私が提供した例は仕事であり、体系的な問題はなく、より高い次元を妨げることになります。
ユースケースに一致することを願っています。あなたは不確定な、静的に未知/予測不可能な多数の次元を考えていませんか?
私はそうは思いませんが、条件付きロジックを使用して、小さな範囲の「DIM」のすべてのケースを処理できます。 –
関数が実行するマクロは使用しないでください。 – Olaf
あなたは[Boost :: Preprocessor](http://www.boost.org/doc/libs/release/libs/preprocessor/)でそれを行うことができます。そのコードはCまたはC++プリプロセッサ用です。 Boost :: Preprocessorを使ってはいけません。 –