2016-07-29 7 views
0

私はstd #definesとmin max関数のマクロ展開に精通していますが、これは私をスローします。特に#の定義にある。あなたの考えは高く評価されました。Unfamiilarマクロ展開

#define TAB_WIDGET_ROW(t)  {t##_seq, t##_len, t##_rep} 
+0

トークンペーストと呼ばれています。あなたの答えとして持っているgccリンクの他に、これはVisual Studioのものです:https://msdn.microsoft.com/en-us/library/09dwwt6y.aspx –

答えて

1

##に展開されるだろう連結のために使用されるCプリプロセッサ標準マクロです。

この方法で、コード:

#define TAB_WIDGET_ROW(t)  {t##_seq, t##_len, t##_rep} 

int foo[3] = TAB_WIDGET_ROW(bar); 

はに拡張されます:

int foo[3] = {bar_seq, bar_len, bar_rep}; 

そしてfoo配列は変数bar_seqbar_lenbar_repの値で入力されます。

詳細については、hereを参照してください。

+0

ありがとうございます。良い説明と良いリンクも。 – user2579721

+0

私はニックピッキングしますが、 '##'は* GCC固有ではありません。 C99またはC11(またはC++ 11など...)コンパイラは同様にそれを理解する必要があります。 –

+0

@BasileStarynkevitch私たちがニックピッキングしている場合、コンパイラは気にしません。それはそれを行うプリプロセッサです。 ;-)でも、これがGCC特有のものであるという考えは、実際にはニトロではなく、まったく危険な虚偽の声明です。これは完全に標準化されています。私はこの答えを反映させるためにこの答えを固定してもらいたいと思う。さらに、OPにはGCCは言及されていないので、これがGCC固有のものであっても、答えは必ずしも関連性があるとは限りません。 –

2

C Preprocessorについては、documentationをお読みください。 ##は約Concatenationです。だからあなたのTAB_WIDGET_ROWマクロのTAB_WIDGET_ROW(xy)のような呼び出しは、おそらく{xy_seq, xy_len, xy_rep}

+1

またhttps://stackoverflow.com/documentation/c/447/preprocessor-and-macros/5494/token-pasting –

関連する問題