【问题标题】:strange macro in c, using multiple statements [duplicate]c中的奇怪宏,使用多个语句[重复]
【发布时间】:2013-07-17 13:41:16
【问题描述】:

我在阅读 linux 源代码时发现了一些奇怪的语法。 container_of 宏看起来像

#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

让我感到困惑的是 ({statement1; statement2;}) 之类的语法

我尝试了一些简单的代码,例如

int a = {1;2;};

我用 gcc 编译它。运行后,'a' 似乎是 2。但它无法用 Microsoft VC++ 编译。这种语法是 gcc 的扩展功能吗?如果是这样,如何在没有gcc扩展的情况下获得相同的效果,例如定义多个语句并使用宏返回一个值?

【问题讨论】:

  • 你为什么这么问? Linux内核需要gcc(或者一个非常兼容的编译器,比如最新版本的TinyCCLLVM/Clang) 进行编译。

标签: c linux gcc macros


【解决方案1】:

({...}) 语法是 GCC 扩展,称为 statement expressions

typeof 是另一个 GCC 扩展。

这两个扩展都在其他一些编译器中可用,例如 LLVM/Clang(或 TinyCC)。

Linux 内核经常使用它们。

很难避免它们。如果你真的想要,你可能会考虑(这是一个不平凡的任务),从GIMPLE 转换回低级、不可移植和不可读的 C。你可以使用 MELT 来做这个(部分工作由 J.Salvucci 在其文件 melt/xtramelt-c-generator.melt 中完成)。

【讨论】:

  • 谢谢。 Linux内核中有很多精巧的代码对我来说是很有价值的参考。但有时我不允许使用 gcc,所以我认为我应该尝试一些其他方法以在其他编译器中获得类似的效果。
  • 我不知道谁禁止您(以及为什么)使用gcc,但您可以使用接受相同语言扩展名的clang
猜你喜欢
  • 2013-07-16
  • 2013-12-12
  • 2016-08-26
  • 2010-11-24
  • 2012-03-14
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多