c - C中的typeof括号是什么意思?

标签 c typeof

<分区>

我正在研究 Linux 的 container_of 函数,我发现 typeof 的括号的使用真的很困惑。

这是container_of函数的代码:

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

在第二行,我们有

const typeof( ((type*)0)->member) * __mptr =(ptr);

我不明白为什么我们在右边使用括号。

我在网上搜索了一下,发现了一些类似的用法。例如,来自 https://gcc.gnu.org/onlinedocs/gcc/Typeof.html , 我找到了一个函数 max(a,b)

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

在这种情况下,我们确实有类似的用法 typeof (a) _a = (a);

为什么要在右边加括号?能不能把右边的括号去掉,变成typeof (a) _a = a;

提前致谢!

最佳答案

通过 #define 创建的宏执行直接标记替换。因此,在类函数宏的参数周围使用括号是一种很好的做法,因为它可以防止发生意外问题。

例如:

#define multiply(x, y) x * y

如果你在这里使用这个宏:

int z = multiply(1 + 3, 4 + 5) / 3;

您可能希望 z 包含值 12,但您会错了。

它将上面的内容扩展为:

int z = 1 + 3 * 4 + 5 / 3;

这将导致 14。使用括号可避免此问题。如果它被定义为:

#define multiply(x, y) ((x) * (y))

那么上面的例子将扩展为:

int z = ((1 + 3) * (4 + 5)) / 3;

这会给出预期的结果。

关于c - C中的typeof括号是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54394683/

相关文章:

c - MPI:如何让其他处理器等待主处理器直到其工作完成

c - 该指针函数中返回代码的用途是什么?

c - Borland C rand() 的实现

vb.net - 通用 TypeOf 运算符?

javascript - 如果 Not undefined 和 indexOf ('foo' ) 做某事

C# 如何使用类型为 "Type"的对象初始化泛型类

Javascript:创建循环来检查变量是否为 int

c - 为什么这个多线程 C 程序给我段错误?

c# - 如何在控制台应用程序中生成彩色 GUI?

c# typeof 应用于泛型参数父类(super class)型