1

C++ では、コンパイル時に複数のファイルに対して定数を自動的に生成する方法はありますか? 列挙型が単一のファイルで自動的に生成された定数を持っているのと同じですが、定数は複数のファイルで一意でなければなりません。

例えば:

classBase.hpp

classBase{
    //blah blah
};

classA.hpp

class childA : public classBase{
private:
    static const unsigned int mID = NEXT_ID;    
};

classB.hpp

class childB : public classBase{
private:
    static const unsigned int mID = NEXT_ID;    
};

classC.hpp

class childC : public classBase{
private:
    static const unsigned int mID = NEXT_ID;    
};

したがって、この場合、classBase から継承する各クラスには、次の ID (0、1、2...) が自動的に割り当てられます。

s でそれを行う方法があると思いますが、何かが割り当てられるたびに#definea を自動的にインクリメントする方法がわかりません。これを行う方法はありますか?#define

4

1 に答える 1

4

自分でコンパイル時にシーケンスを生成するのは簡単ではありませんが、ほとんどのコンパイラはこの目的のためにマクロをサポートしています: __COUNTER__. これはカウンタであり、ソース コードで使用されるたびにコンパイラ自体によって増加されるため、複数のファイルで使用できます。たとえば、コードは次のようになります。

class childB : public classBase {
private:
    static const unsigned int mID = __COUNTER__;    
};

コンパイラがそのマクロを提供していない場合 (または ID 生成をさらに制御する必要がある場合) は、さらに多くのコードを記述する必要がありますが、テンプレート メタプログラミングを使用して行うことができます。

于 2013-05-16T10:54:29.250 に答える