0

重複のないマクロの引数であるトークン (整数) のリストに展開する gnu C マクロを作成することは可能でしょうか。引数の数は (当面は) 固定されていると想定できます。つまり、次のようなものが欲しい:

#define MAC(a,b,c) ???

たとえば展開する

MAC(1,2,1)

1,2。引数はソートされず、結果はソートされる必要はありません。


以下の提案に基づいて、p99 インクルードを使用して基本的に必要なことを行う例を作成しました。

#include <p99/p99_if.h>
#include <p99/p99_paste.h>

#define MAC2(a,b) double P99_PASTE2(myvar_, a) P99_IF_EQ(a,b)()(; double P99_PASTE2(myvar_, b))
#define MAC3(a,b,c) double P99_PASTE2(myvar_, a) P99_IF_EQ(a,b)()(; double P99_PASTE2(myvar_, b)) P99_IF_EQ(a,c)()(P99_IF_EQ(b,c)()(; double P99_PASTE2(myvar_, c)) )

MAC2(1,2);
MAC2(3,3);

MAC3(1,2,3);
MAC3(10,10,1);
4

1 に答える 1

1

あなたの引数があなたの例のように常に小さな10進数である場合、私がP99で提供するもので逃げることができます。次のように使用できるようなマクロがありますP99_IF_EQ

#define MAC(A,B) unsigned P99_PASTE2(myvar_, A) P99_IF_EQ(A,B)()(; unsigned P99(unsigned P99_PASTE2(myvar_, B))

MAC(1,2); // -> myvar_1 and myvar_2
MAC(3,3); // -> myvar_3

Bと等しくない場合にのみ宣言を展開しAます。明らかに、3 つの異なる引数の場合、これはすでに少し面倒ですが、実行可能です。

于 2012-12-12T10:42:42.613 に答える