2017-05-12 7 views
2

C++リフレクションメソッドを試していて、プリプロセッサマクロの理解に問題があります。たとえば、次のコードが動作します。定数付きプリプロセッサマクロの理解

がheader.h:

#define META_PROPERTY(NAME, TYPE, ACCESS, MIN, MAX) \ 
class NAME##_MetaProperty : public sge::GetSet<TYPE> \ 
{ \ 
public: \ 
    NAME##_MetaProperty(TYPE *NAME) \ 
     : GetSet(NAME, ACCESS) \ 
     , min_(MIN) \ 
     , max_(MAX) \ 
    {} \ 

    . . . other methods . . . 

private: \ 
    TYPE min_; \ 
    TYPE max_; \ 
}NAME##_prop(&NAME); \ 

main.cppに

main 
{ 
    uint32 u(255); 
    META_PROPERTY(u, uint32, ACCESS_DEFAULT, 0, 1024); 
    ... 
} 

マクロは喜んで不完全なコンストラクタにもかかわらず、NAME ## _メタプロパティオブジェクトを作成し、私は、プリプロセッサは、単にいっぱい以来、私は理由を理解推測しますMINのMAXパラメータ。しかし、コンストラクタを次のように変更すると、コンパイルエラーが発生します。

public: \ 
    NAME##_MetaProperty(TYPE *NAME, TYPE MIN, TYPE MAX) \ 
     : GetSet(NAME, ACCESS) \ 
     , min_(MIN) \ 
     , max_(MAX) \ 
    {} \ 

1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2143: syntax error: missing ')' before 'constant' 
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2143: syntax error: missing ';' before 'constant' 
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2059: syntax error: 'constant' 
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2059: syntax error: ')' 
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2334: unexpected token(s) preceding ':'; skipping apparent function body 
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2059: syntax error: '&' 
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): warning C4183: 'u_prop': missing return type; assumed to be a member function returning 'int' 
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(45): error C2059: syntax error: '=' 
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(45): error C2238: unexpected token(s) preceding ';' 

定数をあらかじめ定義しておけば、別の小さなエラーが発生します。

main 
{ 
    const uint32 min(0); 
    const uint32 max(1024); 
    META_PROPERTY(u, uint32, ACCESS_DEFAULT, min, max); 
} 

1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2664: 'main::u_MetaProperty::u_MetaProperty(const main::u_MetaProperty &)': cannot convert argument 1 from 'uint32 *' to 'const main::u_MetaProperty &' 
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): note: Reason: cannot convert from 'uint32 *' to 'const main::u_MetaProperty' 
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): note: No constructor could take the source type, or constructor overload resolution was ambiguous 

MINとMAXをコンストラクタで渡すことができない理由を理解しようとしています。このマクロは私の定数で何をしていますか?

答えて

3

あなたがc'torを変更する方法は、それがこれらの無効な識別子です

u_MetaProperty(uint32 *u, uint32 0, uint32 1024) 

に展開されます。

あなたは、コンストラクタのパラメータとしてMAXとMINを渡すことで、真に断固している場合、これはあなたがそれを行うだろうかです:

#define META_PROPERTY(NAME, TYPE, ACCESS, MIN, MAX) \ 
class NAME##_MetaProperty : public sge::GetSet<TYPE> \ 
{ \ 
public: \ 
    NAME##_MetaProperty(TYPE *NAME, TYPE min, TYPE max) \ 
     : GetSet(NAME, ACCESS) \ 
     , min_(min) \ 
     , max_(max) \ 
    {} \ 

    . . . other methods . . . 

private: \ 
    TYPE min_; \ 
    TYPE max_; \ 
}NAME##_prop(&NAME, MIN, MAX); \ 

しかし、彼らはコンパイル時定数であるために仮定されているので、マクロはその仕事をしていませんもうすでに。

+0

この時点で、私は動作するコードに行きます。ありがとう。 – JimK

関連する問題