在 Visual Studio 中是否有类似于语句表达式的等效方式?

16

GCC有一个语句表达式的特性,允许将宏定义为:

#define maxint(a,b) \
   ({int _a = (a), _b = (b); _a > _b ? _a : _b; })

这在Visual Studio中是不合法的。

微软Visual Studio有类似的功能吗? (我知道,最好使用GCC。但我只是好奇)。

或者,我们只能诉诸于内联函数?


1
内联函数并不一定是最后的选择。使用模板,您可以获得类似的性能和类型安全性。我随时都会选择这种方式。 - drdwilcox
1
等一下,这跟 a > b ? a : b 有什么不同吗?另外 @drdwilcox,他正在使用 C 而不是 C++,所以模板不是一个选项。 - Seth Carnegie
1
@Seth 你的宏评估两次。 - David Heffernan
3
更正:这不是在 Visual Studio 中非法,而是在 C(或C ++)中不允许。简短的答案是不行。如果您想要一个内联函数,那就应该使用它。 - Jerry Coffin
@AdamRosenfield 抱歉,我错过了“C”部分。 - Raymond Chen
显示剩余9条评论
2个回答

11

Microsoft编译器没有相应的功能来支持这个非标准的GCC语言扩展。


但是Linux内核在代码中使用非标准C语言特性不是很奇怪吗?这使得内核代码除了gcc之外的标准C编译器无法编译。 - SHH
1
这只是Linux走过的道路。内核与应用程序有不同的驱动力。 - David Heffernan

6
如果您使用的是C ++,我相信可以使用lambda函数:
#define maxint(a,b) \
   ([=] () {int _a = (a), _b = (b); return _a > _b ? _a : _b; }())

4
Visual Studio支持C中的lambda函数吗? - Keith Thompson
抱歉,没注意到'C'标签。 - Bryan
4
无论如何,这并不相同。例如,在语句表达式中,你可以从函数中返回,但在lambda中却不能这样做。 - Timmmm
为什么不直接使用 #define maxint(a,b) ([=] () {return (a) > (b) ? (a) : (b); }()) 呢? - Sakuragaoka
@Sakuragaoka 在定义中放置一个 Lambda 函数似乎是两败俱伤。此外,正如已经指出的那样,Lambda 函数无法从调用作用域返回。 - Smiley1000
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接