2016-07-29 140 views
0

我熟悉std #defines和宏最大扩展功能,但这个引发了我。特别是定义中的#。你的想法感激。Unfamilar宏扩展

#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

你应该阅读一些documentation关于C Preprocessor##约为Concatenation。因此,您的TAB_WIDGET_ROW宏的调用TAB_WIDGET_ROW(xy)可能会扩展为{xy_seq, xy_len, xy_rep}

+1

还有https://stackoverflow.com/documentation/c/447 /预处理器和宏/ 5494 /令牌粘贴 –