close

原文:
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Nonmember,_Static_Member,_and_Global_Functions

在軟體開發的過程中,有些時候有必要定義一個不和任何class instance有關聯的非class member function。此時我們應盡量少用global function,如果真的非要使用不可,應該將之放在namespace裡面,或是使用class的static member function作為替代方案。

因為使用completely global function(指未放在namespace裡的global function)會汙染全域的命名空間(global namespace)。比方說你自定義了一個global function名為sort(),而你#include進來的3rd party library中也定義了另一個sort(),此時就會造成命名碰撞的問題。

早期C-style的解決方法是在每個function的最前面加上自訂的prefix,比方說把sort()加上my變成mysort();在MFC中常見以Afx作為prefix的function就是一個例子。(其實Afx不過就是微軟內部一個team的名字)

現在C++有支援namespace這個feature,就是為了解決這樣的問題;所以我們應該使用language build-in的feature,而不是自己實作另一套替代方案,重新打造輪子實在不高明。

non-member function除了必須放在namespace裡之外,也不該去存取external variable(定義在其他translation unit裡的global variable),以避免增加translation unit之間的dependency。

為了避免不必要的耦合,我們可以使用static關鍵字來修飾non-member function或是使用unnamed namespace,如此一來該function的scope就被限制在該translation unit之中,其他translation unit中的function將無法呼叫它。而使用unnamed namespace是比較推薦的作法。

arrow
arrow
    文章標籤
    C++
    全站熱搜

    coherence 發表在 痞客邦 留言(0) 人氣()