2012-06-30 13 views
5

我必須用一些整數ID在不同的文件中編寫一些常量。例如:編譯時的整數值

#define MESSAGE_FIRST 0 

在其他的文件:

#define MESSAGE_ANOTHER 1 

任何方式來自動獲取該id在編譯的時候?例如:

#define MESSAGE_AUTO GetNextId() 

我不能在這裏使用枚舉,因爲這個指令將在不同的文件中。

謝謝。

p.s. GCC,Linux

+0

該標準沒有類似\ _ \ _ COUNTER \ _ \ _(類似於\ _ \ _ LINE \ _ \ _)AFAIK。附:在我自己的預處理器中,我有這個。 –

+0

我想不出有什麼辦法可以在外部代碼生成之外做到這一點。但是,如果您對您正在嘗試解決的實際問題進行更全面的描述,我們可以爲您提供更好的解決方案。 –

+1

他們必須在不同的文件?或者他們都可以包含一個包含這些值的頭文件? – Matt

回答

5

你可以做一個編譯時間計數器,以繼承和功能超載:

template<unsigned int n> struct Count { bool data[n]; }; 
template<int n> struct Counter : public Counter<n-1> {}; 
template<> struct Counter<0> {}; 
Count<1> GetCount(Counter<1>); 

#define MAX_COUNTER_NUM 64 
#define COUNTER_VALUE (sizeof(GetCount(Counter<MAX_COUNTER_NUM + 1>()))/sizeof(bool)) 
#define INC_COUNTER Count<COUNTER_VALUE + 1> GetCount(Counter<COUNTER_VALUE + 1>); 

你可以看到它在行動here。也適用於msvc。

1

你說你在使用GCC。 GCC具有名爲__COUNTER__的(AFAIK每個文件)宏,每次使用後都會增加1。

請注意,這是一個擴展,不包含在標準C++中。

另一種選擇是使用枚舉:

enum { 
    FIRST = 0, 
    SECOND, 
    THIRD 
}; 

或者你也可以做到這一點使用手動預處理器指令是這樣的:

#define FIRST 0 
#define SECOND (1 + FIRST) 
#define THIRD (1 + SECOND) 
+0

最新提示怎麼樣:當所有東西都是一個文件時,這是非常有用的,我需要不同的東西,一些程序員會編輯這些代碼,以避免可能的衝突。 – Ockonal

+2

定義SECOND和THIRD時請使用parens。 – robert

+0

@robert:你說得對,修好了。 – orlp