1

次のようなコンパイル時定数を作成することは可能ですか:

// event.h
#define REGISTER_EVENT_TYPE() ... // Returns last_returned_number+1

// header1
#define SOME_EVENT REGISTER_EVENT_TYPE()
// header2
#define SOME_OTHER_EVENT REGISTER_EVENT_TYPE()

どこSOME_EVENTが0にSOME_OTHER_EVENTなり、1になります。

次のコードを試しました:

#define DEF_X(x) const int x = BOOST_PP_COUNTER;
#define REGISTER_EVENT_TYPE(x) BOOST_PP_UPDATE_COUNTER()DEF_X(x)

#include REGISTER_EVENT_TYPE(SOME_EVENT_TYPE)  

ただし、eats 定数宣言を含めます。

4

1 に答える 1

1

はい、可能ですが、const/constexpr intBoost.Preprocessor と併用してください。

BOOST_PP_COUNTERを参照

使用例:

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

constexpr int A  = BOOST_PP_COUNTER; // 0

#include BOOST_PP_UPDATE_COUNTER()

constexpr int B = BOOST_PP_COUNTER; // 1

#include BOOST_PP_UPDATE_COUNTER()

constexpr int C = BOOST_PP_COUNTER; // 2

#include BOOST_PP_UPDATE_COUNTER()

constexpr int D = BOOST_PP_COUNTER; // 3

作業例を参照してください。


最終的な注意: 結果を保存するためにマクロを使用しないでください。そのような定義されたすべての定数で、最終的に同じ数値が得られます。

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

#define A  BOOST_PP_COUNTER // A is 0

#include BOOST_PP_UPDATE_COUNTER()

#define B BOOST_PP_COUNTER // B is 1, but A is 1 too

int main() { cout << A << B << endl; }

出力:

 11
于 2015-02-25T17:02:25.053 に答える