7

なぜこれがうまくいかないのですか?

 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 で動作することが確認されています。

4

1 に答える 1

11

__LINE__展開されるように、間接的なレベルを追加する必要があります。

#define _CONCAT_(x,y) x ## y
#define CONCAT(x,y) _CONCAT_(x,y)

#define VAR_LINE(x) int CONCAT(_anonymous, __LINE__) = x
于 2009-01-20T12:55:28.273 に答える