2009-09-24 68 views
5

開放Postgres的代碼庫,我看到那麼多的C代碼通過具有指針寫的 - >符號以這樣一種方式:C和指針符號

(foo)->next = 5; 

我知道指針性的符號優先級,例如 - > =(* foo)。與* foo不一樣。

但是,當括號在變量名稱之外並且取消引用下一個地址或僅僅是編碼風格特有的約定時,它是否意味着什麼?

回答

6

它是一種我從未見過的編碼慣例。

但它沒有改變任何東西。

(foo)->next = 5; 

完全等同於

foo->next = 5; 
+0

太棒了,謝謝。這就是我的想法,並且發現它特別奇怪,因爲它在代碼庫中無處不在。 – mduvall 2009-09-24 03:00:22

+1

爲了擴展它,你會使用這個構造的原因是在foo是一個宏的情況下作爲安全帶。一些C風格指南(例如FreeBSD的)提示所有返回語句的格式爲return(x);而不是僅僅返回x; – Benno 2009-09-24 03:04:20

+1

儘管如果'foo'是一個宏,明智的做法是將它完全加括號,例如, '#define foo(blargity-> blah)' – 2009-09-24 03:36:04

1

這是沒有意義的。括號不起作用,因爲它們內部的表達非常簡單。它基本上

(*(foo)).next = 5; 

哪像你所看到的,是一個外來組括號。如果這是項目如何做的話,那就去做吧。否則,我認爲它看起來相當糟糕,所以我會盡量不使用它。

+0

您是不是指''(*(foo))。next = 5;''? – 2009-09-24 03:10:55

+0

哦。對。至少現在我覺得有一個原因,我不能專注於我的作業。感謝您指出,並感謝羅伯特修復它。 – 2009-09-24 03:39:24

2

它是安全編碼規範。

在簡單的代碼中,其中foo只是一個指針,parens是多餘的。

(foo)->next = 5; 

然而,考慮是否有或是FOO可能是由宏觀所以它是一個更復雜的表達式定義的機會。

在這種情況下,可能需要parens來避免編譯器錯誤,或者更糟糕的是,避免不正確的優先級。試想一下,如果它轉換成一個醜陋的表達,如:

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

或共同鑄就:

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

東西要牢記與慣用 C代碼的宏經常被用來作爲一個抽象機制對於我們可能在其他語言中做的更明確的事情;-)

+0

任何不會將_doesn'_加括號擴展的宏是一個問題。恕我直言,應該是宏的工作,以確保自己的使用安全,而不是宏觀調用者的工作。 – 2009-09-24 04:17:09