C 这个宏返回是什么?

C 这个宏返回是什么?,c,macros,C,Macros,我见过如何使用这个宏的返回值,但从定义来看,我无法理解TNAD,它是执行返回的值 // packet parsing state machine helpers #define cursor_advance(_cursor, _len) \ ({ void *_tmp = _cursor; _cursor += _len; _tmp; }) 宏返回指针\u tmp 这是一个gcc特性:宏不返回任何内容。相反,宏的调用被替换为与宏体内联(替换了宏参数) 如果你有密码 s

我见过如何使用这个宏的返回值,但从定义来看,我无法理解TNAD,它是执行返回的值

   // packet parsing state machine helpers
    #define cursor_advance(_cursor, _len) \
      ({ void *_tmp = _cursor; _cursor += _len; _tmp; })

宏返回指针\u tmp


这是一个gcc特性:

宏不返回任何内容。相反,宏的调用被替换为与宏体内联(替换了宏参数)

如果你有密码

some_variable = cursor_advance(my_cursor, some_length);
然后,预处理器将其替换为

some_variable = ({ void *_tmp = my_cursor; my_cursor += some_length; _tmp; });

这又是GCC C编译器对C语言的扩展,名为。它计算
({
})
之间的语句,结果是最后一个表达式。在上述示例中,结果为
\u tmp


整个表情

some_variable = ({ void *_tmp = my_cursor; my_cursor += some_length; _tmp; });
相当于这些陈述

{
    void * _tmp = my_cursor;
    my_cursor += some_length;
    some_variable = _tmp;
}

“结果是最后一个表达式”这与逗号运算符类似?@Ayxan类似,但允许在结果表达式之前使用任意语句。u8*cursor=0;结构以太网=游标前进(游标,大小(*以太网));所以这里的游标值将被分配给以太网,而游标的大小将增加一个指向以太网的指针,对吗?