私はstd #definesとmin max関数のマクロ展開に精通していますが、これは私をスローします。特に#の定義にある。あなたの考えは高く評価されました。Unfamiilarマクロ展開
#define TAB_WIDGET_ROW(t) {t##_seq, t##_len, t##_rep}
私はstd #definesとmin max関数のマクロ展開に精通していますが、これは私をスローします。特に#の定義にある。あなたの考えは高く評価されました。Unfamiilarマクロ展開
#define TAB_WIDGET_ROW(t) {t##_seq, t##_len, t##_rep}
##
に展開されるだろう連結のために使用される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_seq
、bar_len
とbar_rep
の値で入力されます。
詳細については、hereを参照してください。
ありがとうございます。良い説明と良いリンクも。 – user2579721
私はニックピッキングしますが、 '##'は* GCC固有ではありません。 C99またはC11(またはC++ 11など...)コンパイラは同様にそれを理解する必要があります。 –
@BasileStarynkevitch私たちがニックピッキングしている場合、コンパイラは気にしません。それはそれを行うプリプロセッサです。 ;-)でも、これがGCC特有のものであるという考えは、実際にはニトロではなく、まったく危険な虚偽の声明です。これは完全に標準化されています。私はこの答えを反映させるためにこの答えを固定してもらいたいと思う。さらに、OPにはGCCは言及されていないので、これがGCC固有のものであっても、答えは必ずしも関連性があるとは限りません。 –
C Preprocessorについては、documentationをお読みください。 ##
は約Concatenationです。だからあなたのTAB_WIDGET_ROW
マクロのTAB_WIDGET_ROW(xy)
のような呼び出しは、おそらく{xy_seq, xy_len, xy_rep}
またhttps://stackoverflow.com/documentation/c/447/preprocessor-and-macros/5494/token-pasting –
トークンペーストと呼ばれています。あなたの答えとして持っているgccリンクの他に、これはVisual Studioのものです:https://msdn.microsoft.com/en-us/library/09dwwt6y.aspx –