C ++ анонимные переменные - PullRequest
6 голосов
/ 20 января 2009

Почему это не сработает?

 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__, потому что никакая переменная никогда не будет объявлена ​​в той же строке, как эта. Но расширение макроса беспокоит меня, вы можете помочь?

Обновление: правильный ответ

Спасибо Люку Турэ. Однако с предлагаемым решением возникла крошечная проблема. Между операндами и оператором ## должен быть пробел (очевидно, стандарт говорит иначе, но GCC со вкусом PS3 не будет правильно расширять макрос, если между оператором и операндами не будет пробела).

#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 (ксенон) и PS3.

1 Ответ

11 голосов
/ 20 января 2009

Вам необходимо добавить уровень косвенности, чтобы __LINE__ был расширен:

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

#define VAR_LINE(x) int CONCAT(_anonymous, __LINE__) = x
...