c - c中的奇怪宏,使用多个语句

标签 c linux gcc macros

<分区>

我在阅读 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 扩展的情况下获得相同的效果,例如定义多个语句并使用宏返回一个值?

最佳答案

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

typeof是另一个 GCC 扩展。

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

Linux 内核经常使用它们。

要避免它们是相当困难的。如果你真的想要,你可能会考虑(这是一项非常重要的任务),从 GIMPLE 进行一些转换。回到低级、不可移植和不可读的 C。你可以使用 MELT为此(部分工作由 J.Salvucci 在其文件 melt/xtramelt-c-generator.melt 中完成)。

关于c - c中的奇怪宏,使用多个语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17701384/

相关文章:

c - 避免使用临时文件,当函数需要传递 FILE * 时

c - 编译程序时退出状态问题

c++ - 与 Windows 相比,将数组写入文件的相同代码在 Linux 上少写了 1 行

c - shellcode缓冲区溢出-SegFault

c - C 中的字符串操作,语法正确,但不适用于 MacOS 或 freeBSD

c - 未定义函数编译和链接

c - 使用 NBIO 的高效预 fork 服务器设计,例如使用 libevent 的 epoll、kqueue

c - C 中带有指针的 int 矩阵 - 内存分配困惑

客户端-服务器应用程序上的 Linux 套接字输入通知

linux - 对 bash 脚本中特定命令的特权访问