Вопрос по c++, visual-studio-2010 – Создание макроса с использованием __LINE__ для разных имен переменных [дубликат]
Possible Duplicate:
Creating C macro with ## and LINE (token concatenation with positioning macro)
Я пытаюсь использовать__LINE__
макрос для генерации разных имен переменных. У меня есть тестируемый класс Benchmark (расположенный в пространстве имен utils), и его конструктор принимает строку. Вот определение макроса, которое я создал:
<code>#define BENCHMARK_SCOPE utils::Benchmark bm##__LINE__(std::string(__FUNCTION__)) </code>
К сожалению, это вызывает следующую ошибку:
<some_file_name>(59): error C2374: 'bm__LINE__' : redefinition; multiple initialization
Это приводит меня к выводу__LINE__
макросы не расширяются. Я создал свой макросс согласноэта почта, У вас есть идеи, почему__LINE__
не расширяется?
EDIT: вероятно информация компилятора также релевантна. Я использую Visual Studio 2010.
bm## __LINE__
(с пробелом)?
Cameron
#define _BENCHMARK_SCOPE(line) utils::Benchmark bm##line(...
с#define BENCHMARK_SCOPE _BENCHMARK_SCOPE(__LINE__)
Cameron
#define COMBINE1(X,Y) X##Y // helper macro
#define COMBINE(X,Y) COMBINE1(X,Y)
А затем использовать его как,
COMBINE(x,__LINE__);
Вы используете вставку токена. Это происходитbefore рекурсивный макрос расширение (так что вы можете вставить токен, чтобы получить имя макроса вы хочу призвать). Таким образом:
#define PASTE(a,b) a ## b
вставит точные аргументы, переданныеPASTE
затем попробуйте расширить
Полученный новый токен. Чтобы получить желаемый эффект, вам нужен
дополнительный уровень косвенности:
#define PASTE_HELPER(a,b) a ## b
#define PASTE(a,b) PASTE_HELPER(a,b)
Здесь аргументыPASTE
будет расширен доPASTE_HELPER
является
вызывается.
#define CONCATENATE_DIRECT(s1, s2) s1##s2
#define CONCATENATE(s1, s2) CONCATENATE_DIRECT(s1, s2)
#ifdef _MSC_VER // Necessary for edit & continue in MS Visual C++.
# define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __COUNTER__)
#else
# define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __LINE__)
#endif
int ANONYMOUS_VARIABLE(var)
РЕДАКТИРОВАТЬ:
Я думаю, что вы должны использоватьCOUNTER в Visual Studio, только если также используются предварительно скомпилированные заголовки.