《C 覆轍錄》 2 6 宣告飾詞次序的小聰明

2021-09-23 16:13:02 字數 1727 閱讀 2969

就語言本身所限,宣告飾詞孰先孰後純屬無關緊要的形而上之爭:

`int const extern size = 1024; // 合法,但有離奇不經之嫌 `

無論如何,如果沒有令人信服的理由去背離習慣用法,那麼頂好還是接受有關宣告飾詞次序事實上的標準:先寫連線飾詞,再寫量化飾詞,再寫型別。

extern const int size = 1024; // 正常下面這個指標的型別是什麼呀?

int const *ptr = &size; ```

對,這是乙個指涉到常量整數型別的指標。但你根本難以置信有多少軟體工程師會把它誤讀成乙個指涉到一般整數型別的常量指標18:

`int * const ptr2 = &size; // 錯誤! `

以上是兩種完全不同的型別。當然了,第一種指標型別可以指涉到乙個常量整數型別,第二種不行19。很多軟體工程師會隨口把「指涉到常量型別的指標」念成「常量指標」,這不是乙個好習慣,它只會把你要表達的真實意思(「指涉到常量型別的指標」)傳達給那些粗枝大葉之徒,而真正字斟句酌的稱職後生則會被你的言辭誤導(理解成「指涉到一般型別的常量指標」)。

當然需要承認的是,標準庫里有乙個字面上表示「常量迭代器」之意的`const_iterator`概念,它無可救藥地實際上表示乙個「指涉到常量元素的迭代器」,而這些迭代器自身卻並不具常量性(標準委員會的傢伙們某天吃錯了藥不是你要向他們學壞的理由)。仔細區分「指涉到常量型別的指標」和「常量指標」(參見常見錯誤31)。

由於宣告飾詞次序在技術層面上無關緊要,乙個指涉到常量的指標可以以兩種形式宣告:

const int *pci1;

int const *pci2;`

有些c++專家比較提倡第二種書寫形式,因為他們認為對於更複雜的指標型別宣告來說,這種寫法更容易讀:

int const * const * pp1;  ```

把量化飾詞const置於若干宣告飾詞的最後,這樣我們就可以倒過來讀所有的指標型別的飾詞。從右到左,pp1的指涉物是乙個常量(`const`)指標,後者指涉到乙個整數常量(`const int`)。而習慣的飾詞次序則不支援這樣的平凡規則:

const int const pp2; // pp2的型別和pp1完全相同⑦`

⑦譯者注:本書作者顯然在後來的歲月裡改變了他的有關飾詞次序的看法,變得更加包容。他在本書裡把兩種飾詞的次序中的乙個打上了「不推薦」的烙印,顯然覺得兩種用法裡一種優於另一種。但他在另一本比較晚近出版的書中談到這個問題時,就表示兩種用法選擇哪一種「無關緊要」了。參見(dewhurst, 2006),條款7。而scott meyers在談到量化飾詞應該放在型別前還是後時,則更直截了當地說「你應該同時適應兩者」,參見(meyers, 2006),條款3。根據這些材料及其變遷的歷史軌跡,我們可以說,讀別人的**時,不應該誤讀,而自己在撰寫**時則純屬風格問題,可以根據自己的理解方向和喜好來選擇一種,並固定下來,在編碼實踐中沉澱為自己的**風格的一部分。

前一種飾詞次序的安排也沒有帶來太多複雜性,乙個c++維護工程師若是在要閱讀和維護的**裡存在這樣的片段,他也應該是有能力搞定的。更重要的是,指涉到指標的指標或是其他類似的宣告是較少見的,尤其少見於交由c++新手打理的介面**裡。典型情況是,它們藏匿於基礎實現碼的深處。平凡的、直截了當的指涉到常量的指標就常見得多。所以,還是遵循習慣用法以避免誤解較佳:

const int *pci1; // 正確:指涉到常量的指標

《C 覆轍錄》 1 3 全域性變數

很難找到任何理由去硬生生地宣告什麼全域性變數。全域性變數阻礙了 重用,而且使 變得更難維護。它們阻礙重用是因為任何使用了全域性變數的 就立刻與之耦合,這使得全域性變數一改它們也非得跟著改,從而使任何重用都不可能了。它們使 變得更難維護的原因是很難甄別出哪些 用了某個特定的全域性變數,因為任何 都有訪...

《C 覆轍錄》 1 11 聰明反被聰明誤

c 語言和c語言看起來會吸引相當多的人去張揚個性 你有沒有聽說過乙個叫 obfuscated eiffel 的比賽?46。在這些軟體工程師的思維裡,兩點間的最短距離是普通歐氏空間之球面扭曲上的大圓。試舉一例 在c 語言的圈子裡 且不論這個圈子是不是普通歐氏空間裡的 的排版格式純粹是為了方便解讀 的人...

《C 覆轍錄》 常見錯誤1 過分積極的注釋

c 覆轍錄 說乙個問題是基礎的,並不就是說它不是嚴重的或不是普遍存在的。事實上,本章所討論的基礎問題的共同特點比起在以後章節討論的技術複雜度而言,可能更側重於使人警醒。這裡討論的問題,由於它們的基礎性,在某種程度上可以說它們普遍存在於幾乎所有的c 中。很多注釋都是畫蛇添足,它們只會讓源 更難讀,更難...