Вопрос по c++, visual-studio-2010 – Создание макроса с использованием __LINE__ для разных имен переменных [дубликат]

13

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
@Cameron - все еще не работает. Вот пример на ideone:ideone.com/5r5l1 (постарался сделать это максимально простым) Ivaylo Strandjev
ОК, еще один хак, чтобы попробовать:#define _BENCHMARK_SCOPE(line) utils::Benchmark bm##line(... с#define BENCHMARK_SCOPE _BENCHMARK_SCOPE(__LINE__) Cameron
@Cameron Я сделал благодаря вашему комментарию, но ничего не изменилось. Ivaylo Strandjev

Ваш Ответ

3   ответа
14

#define COMBINE1(X,Y) X##Y  // helper macro
#define COMBINE(X,Y) COMBINE1(X,Y)

А затем использовать его как,

COMBINE(x,__LINE__);
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Ivaylo Strandjev
4

Вы используете вставку токена. Это происходит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 является вызывается.

5

#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, только если также используются предварительно скомпилированные заголовки.

Работал сLINE также. Ivaylo Strandjev

Похожие вопросы