いくつかの整数 ID を持つ別のファイルにいくつかの定数を書き込む必要があります。例えば:
#define MESSAGE_FIRST 0
他のファイル:
#define MESSAGE_ANOTHER 1
コンパイル時にその ID を自動的に取得する方法はありますか? 何かのようなもの:
#define MESSAGE_AUTO GetNextId()
このディレクティブは別のファイルにあるため、ここでは列挙型を使用できません。
ありがとう。
ps GCC、Linux
いくつかの整数 ID を持つ別のファイルにいくつかの定数を書き込む必要があります。例えば:
#define MESSAGE_FIRST 0
他のファイル:
#define MESSAGE_ANOTHER 1
コンパイル時にその ID を自動的に取得する方法はありますか? 何かのようなもの:
#define MESSAGE_AUTO GetNextId()
このディレクティブは別のファイルにあるため、ここでは列挙型を使用できません。
ありがとう。
ps GCC、Linux
継承と関数のオーバーロードを使用して、コンパイル時のカウンターを実行できます。
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>);
ここで実際の動作を見ることができます。msvc でも動作します。
GCCを使用していると言います。GCCには、使用するたびに1つずつ増加する(AFAIKファイルごとの)マクロが呼び出され__COUNTER__ています。
これは拡張機能であり、標準の C++ には含まれていないことに注意してください。
別のオプションは、列挙型を使用しています。
enum {
FIRST = 0,
SECOND,
THIRD
};
または、次のようなプリプロセッサ ディレクティブを使用して手動でこれを行うこともできます。
#define FIRST 0
#define SECOND (1 + FIRST)
#define THIRD (1 + SECOND)