なぜこれがうまくいかないのですか?
0. #define CONCAT(x, y) x ## y
1.
2. #define VAR_LINE(x) \
3. int CONCAT(_anonymous, __LINE__) = x
4.
5. #define VAR_LINE2(x) \
6. int _anonymous ## x = 1
7.
8. int main()
9. {
10. VAR_LINE(1);
11. VAR_LINE(1);
12. VAR_LINE(1);
13. VAR_LINE2(__LINE__);
14. }
上記のマクロ展開の結果
int _anonymous__LINE__ = 1;
int _anonymous__LINE__ = 1;
int _anonymous__LINE__ = 1;
int _anonymous13 = 1;
__LINE__
そのマクロを引数として書かなくて済むと便利です。
問題はかなり明確だと思います。同じスコープ内で複数の変数を宣言するときに、このマクロが再定義エラーで失敗しないように、匿名変数を生成できるようにしたいと考えています。私の考えは、__LINE__
このように同じ行で変数が宣言されることはないため、定義済みのマクロを使用することでした。しかし、マクロ展開が私を悩ませています。助けてもらえますか?
更新:正解
リュック・トゥライユに感謝します。ただし、提案されたソリューションには小さな問題がありました。オペランドと ## 演算子の間には空白が必要です (明らかに標準ではそうではないと書かれていますが、演算子とオペランドの間に空白がないと、PS3 風味の GCC はマクロを適切に展開しません)。
#define _CONCAT(x,y) x ## y
#define CONCAT(x,y) _CONCAT(x,y)
VAR_LINE マクロは次のようになります。
int _anonymous10 = 1;
int _anonymous11 = 1;
int _anonymous12 = 1;
これは、Win32 (Visual Studio 2008)、XBOX360 (Xenon)、および PS3 で動作することが確認されています。