инкрементно определить? - PullRequest
4 голосов
/ 16 января 2010

Есть ли в любом случае определенное приращение каждый раз, когда вы его используете?

Например

int a = ADEFINE;
int b = ADEFINE;

a равно 1, а b равно 2.

Ответы [ 4 ]

11 голосов
/ 16 января 2010

Вы можете использовать __COUNTER__, хотя это не стандартно. MSVC ++ и GCC поддерживают его.


Если вы можете использовать boost, библиотека препроцессора имеет реализацию counter. Вот пример из документации:

#include <boost/preprocessor/slot/counter.hpp>

BOOST_PP_COUNTER // 0

#include BOOST_PP_UPDATE_COUNTER()

BOOST_PP_COUNTER // 1

#include BOOST_PP_UPDATE_COUNTER()

BOOST_PP_COUNTER // 2

#include BOOST_PP_UPDATE_COUNTER()

BOOST_PP_COUNTER // 3

(Кудо в гс)

4 голосов
/ 16 января 2010

Если вам не нужны постоянные времени компиляции, вы можете сделать что-то подобное для перечисления классов:

int counter() {
    static int i = 0;
    return i++;
}

template<class T>
int id() { 
    static int i = counter();
    return i; 
};

class A {};
class B {};

int main()
{
    std::cout << id<A>() << std::endl;
    std::cout << id<B>() << std::endl;
}
2 голосов
/ 16 января 2010
static int PUT_AN_UNUSED_NAME_HERE = 0;
#define ADEFINE (++PUT_AN_UNUSED_NAME_HERE)
0 голосов
/ 16 января 2010

Почему бы не использовать __LINE__? Это стандартный C89 / C99 / C ++.

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