2010-01-16 19 views
4

每次使用它時,是否有定義增量?增加define?

例如

int a = ADEFINE; 
int b = ADEFINE;

一個是1,b是2

+0

用於什麼?根據你的情況可能有更好的方法。 – GManNickG 2010-01-16 08:56:28

+0

我想給每個班級一個唯一的號碼。 – user230821 2010-01-16 09:03:38

+2

你需要一個不斷變化和unqie編譯時常量,然後呢? – GManNickG 2010-01-16 09:04:39

回答

4

如果您不需要編譯時間常數,你可以做這樣的事情枚舉類:

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
static int PUT_AN_UNUSED_NAME_HERE = 0; 
#define ADEFINE (++PUT_AN_UNUSED_NAME_HERE) 
+4

雖然這不是編譯時間。 – GManNickG 2010-01-16 09:05:42

11

您可以使用__COUNTER__,雖然它不是標準。 MSVC++和GCC都支持它。


如果你可以使用提振,pre-processor library有計數器的實現。下面是從文檔的例子:

#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 

(工藤對GF)

+0

雖然這並不影響提問者,但應該注意'__COUNTER__'只適用於GCC≥4.3。 (例如,Xcode只與GCC 4.2捆綁在一起)。 – kennytm 2010-01-16 16:11:31

+0

我剛剛注意到Boost.Preprocessor提供了一個'__COUNTER__'(類型)的可移植版本:http://www.boost.org/doc/libs/1_41_0/ libs/preprocessor/doc/index.html – 2010-01-23 19:37:14

+0

@gf:謝謝,我會補充一點。 – GManNickG 2010-01-23 19:54:45

0

爲什麼不使用__LINE__?它是標準的C89/C99/C++。

+6

因爲'a'和'b'可能在第14行不同的文件中? – kennytm 2010-01-16 09:34:44