我熟悉std #defines和宏最大扩展功能,但这个引发了我。特别是定义中的#。你的想法感激。Unfamilar宏扩展
#define TAB_WIDGET_ROW(t) {t##_seq, t##_len, t##_rep}
我熟悉std #defines和宏最大扩展功能,但这个引发了我。特别是定义中的#。你的想法感激。Unfamilar宏扩展
#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特有的,答案不一定相关。 –
你应该阅读一些documentation关于C Preprocessor。 ##
约为Concatenation。因此,您的TAB_WIDGET_ROW
宏的调用TAB_WIDGET_ROW(xy)
可能会扩展为{xy_seq, xy_len, xy_rep}
还有https://stackoverflow.com/documentation/c/447 /预处理器和宏/ 5494 /令牌粘贴 –
它被称为令牌粘贴。除了你有答案的gcc链接之外,这个来自Visual Studio:https://msdn.microsoft.com/en-us/library/09dwwt6y.aspx –