Как получить последнее значение __COUNTER__ - PullRequest
0 голосов
/ 18 июля 2011

У меня есть макрос, который выполняет что-то похожее на следующее:

#define MAKE_VALS(...) \
    int val1 = 0; \
    int val2 = 0; \
    :
    if(val1 == val2) \
    { \
        ... 
    }

, и мне нужно использовать его несколько раз в одной функции.Проблема в том, что его использование несколько раз приводит к множественным ошибкам определения из-за нескольких определений val1 и val2.

Использование __COUNTER__ с ## решило бы проблему, но я не вижу, как получитьправильные имена переменных для оператора if?Я не могу использовать __COUNTER__ снова, потому что я получу следующее значение.Мне нужен способ получить последнее значение __COUNTER__.Можно ли это сделать?

PS.Я не хочу окружать его {} с, чтобы решить проблему.Я упростил реальную проблему здесь, и использование {} s вызывает другие проблемы (которые не важны для того, что я спрашиваю).

Ответы [ 2 ]

3 голосов
/ 18 июля 2011

Для какой бы цели это ни было, вы можете достичь этого, используя несколько уровней макросов:

#define MAKE_VALS(...) MAKE_VALS1(..., __COUNTER__)
#define MAKE_VALS1(..., counter) MAKE_VALS2(..., counter)
#define MAKE_VALS2(..., counter) \
   int val1##counter = 1; int val2##counter = 2; \
   val1##counter = whatever; val2##counter = hunoz;

Таким образом, вы можете использовать MAKE_VALS более одного раза в одной и той же области и для каждого вызова.создаст новый набор переменных.Обратите внимание, что без MAKE_VALS1 ваши переменные были бы названы val1__COUNTER__ и т. Д., А дополнительный уровень превращает их в фактическое число.

Это хорошее упражнение в написании макросов, но я согласен с парнями раньшеЯ спросил, является ли это правильным способом достичь того, чего вы пытаетесь достичь.Но об этом было сказано достаточно, поэтому я надеюсь, что это решит вашу проблему.

2 голосов
/ 18 июля 2011
#define MAKE_VALS(m, n, ...) \
    int val ## m = 0; \
    int val ## n = 0; \
    :
    if(val ## m == val ## n) \
    { \
        ... 
    }

Использование:

 MAKE_VALS(__LINE__,
           __LINE__, ... ); //second __LINE__ on next line

Поставьте вторую строку __LINE__ на следующую строку, чтобы избежать одинакового значения для m и n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...