Почему это не сработает?
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.