2017-02-02 16 views

答えて

5

まず、当然、ae_##T##_tである必要があります。 Cの_文字は句読点ではなく、普通の "テキスト"文字(例えば、:,、スペースなどとは対照的です)に注意してください。つまり、ae_Tは、プリプロセッサーによって、単一の連続した分割不可能なトークンとして表示され、aeの後には_が続き、その後にTが続きます。

第2に、たとえばQ25というマクロがそれ自体がマクロであり、それを置換したいと思うと、期待どおりに機能しないことに注意してください。この問題を解決するには、

#define DECLARE_TYPE_(T) \ 
    typedef struct   \ 
    {      \ 
     float value;  \ 
     int scale;   \ 
    } ae_##T##_t; 

#define DECLARE_TYPE(T) DECLARE_TYPE_(T) 

2階層のマクロ定義を必要とする。しかし、あなたがDECLARE_TYPE(Q25)は常に、具体的ae_Q25_tに解決したい場合であるとして、あなたは良いです。

+1

マクロ忍者が登場しました! – P0W

+0

「Cトークン連結」を検索したときに見たすべての例は、右側だけに「##」を使用しています。また、コンパイルする例も片面 '##'です:#define DECLARE_CTYPE(s)\ 名前空間s ## _ space {\ class s ## _; \ } \ typedef s ## _ space :: s ## _ s; '非常に奇妙な、多くのありがとう。 – Danijel

+0

@Danijelこれらの例でも、パラメータの前後に空白がありますが、そうではありませんか?この場合、プリプロセッサは 'ae_T'を単一のトークンとして扱うので、両側で連結を使用する必要があります。 – StoryTeller

関連する問題