C和指针表示法

时间:2009-09-24 02:54:00

标签: c pointers

打开Postgres代码库,我看到很多C代码都是通过指向 - >来编写的。以这样的方式表示:

(foo)->next = 5;

我知道指针符号具有优先级,例如 - > =(* foo)。并且与* foo不同。

但是,当括号在变量名之外并且取消引用next的地址或者它只是一种编码风格特有的约定时,它是否意味着什么?

3 个答案:

答案 0 :(得分:6)

这是我以前从未见过的编码约定。

但它没有改变任何东西。

(foo)->next = 5;

完全等同于

foo->next = 5;

答案 1 :(得分:2)

这是安全的编码惯例。

在简单的代码中,foo只是一个指针,parens是多余的。

(foo)->next = 5;

但是,请考虑是否存在 是否可能由宏定义foo,因此它是一个更复杂的表达式。

在这种情况下,可能需要parens来避免编译器错误,或者更糟糕的是避免错误的优先级。想象一下,如果它转化为丑陋的表达,如:

( ++get_foo() )->next = 5;

或普通演员:

( (db_record*)foo_ptr )->next = 5;

惯用 C代码需要注意的是,宏通常被用作我们可能在其他语言中更明确地做的事情的抽象机制; - )

答案 2 :(得分:1)

没有意义。括号内没有效果,因为它们内部的表达式非常简单。这基本上是

(*(foo)).next = 5;

正如您所看到的,这是一组无关的括号。如果这就是项目的运作方式,那么就去做吧。否则,我觉得它看起来很糟糕,所以我会尽量不使用它。