私は、私のプロジェクトのためのx-macroベースのレジスタファイルレイアウト記述システムを書いています。ほとんどの場合、マクロはテンプレートクラスの階層に展開されます。しかし、私はまたこのようにすべてのレジスタの列挙が欲しい:variadicマクロ展開ではどこにカンマが消えますか?
#define RINT(num,name,flags,width) name,
...
enum Regs
{
#include REGDEF
};
これはうまく動作します。しかし、私はvariadicマクロを使ってエイリアスレジスタも指定します。 __VA_ARGS__の要素間のカンマを取り除くために何の些細な方法はありませんので、(私が知らないことを、私が間違っている場合は、私を修正してください)、私が書く:
今#define RALIAS_10(r0,r1,r2,r3,r4,r5,r6,r7,r8,r9) r0 r1 r2 r3 r4 r5 r6 r7 r8 r9
#define RALIAS_9(r0,r1,r2,r3,r4,r5,r6,r7,r8) r0 r1 r2 r3 r4 r5 r6 r7 r8
...
#define RALIAS_1(r0) r0
#define RALIAS_N(d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,aliasn,...) aliasn
#define RALIAS(...) RALIAS_N(__VA_ARGS__, RALIAS_10(__VA_ARGS__), RALIAS_9(__VA_ARGS__), ..., RALIAS_1(__VA_ARGS__))
、私は
RALIAS(RINT(4, RSP, 0, 64), RINT(4, ESP, 0, 32), RINT(4, SP, 0, 16), RINT(4, SPL, 0, 8))
を書く場合RINTマクロで
コンマ消える:
enum Reg
{
...
RSP ESP SP SPL
...
};
今度は、私が直接
RALIAS_4マクロを使用し、場合私は私が期待するものを手に入れる:
enum Reg
{
...
RSP, ESP, SP, SPL,
...
};
私は、GCCは可変長マクロにロジックを剥ぎ取り、いくつかの非標準的なコンマを適用知っているが、私は明示的に-std = C++ 11を指定するときには起こるべきではありません。さらに、Clangは私にまったく同じ結果をもたらしました。しかし、標準(草稿)やGCCの文書でこの動作を説明するものは見つけられませんでした。
私には何が欠けていますか?
私は、Arch Linux(x86-64)でGCC 6.1.1とClang 3.8.1を試しました。どちらのコンパイラもリポジトリからインストールされました。