1.3.2 其他常見的編碼風格
除了Linux內核的編碼風格,流傳較為廣泛的還有GNU的C語言編碼風格(后文簡稱GNU編碼風格),以及Win32編碼風格等。
知識點:GNU
GNU是GNU’s Not UNIX的遞歸縮寫,它是由自由軟件基金會(Free Software Foundation,FSF)于20世紀80年代發起的一個重要的自由軟件項目。GNU項目的目標是開發一個自由的UNIX變種HURD。盡管HURD的開發處在停滯狀態,但GNU項目開發和維護著許多高質量的基礎軟件和工具,其中包括基礎庫(Glibc)、編譯器(GCC)、編輯器(Emacs)以及各類命令行工具。這些軟件至今仍然在我們的軟件世界中扮演著非常重要的角色。GNU項目的大部分軟件是使用C語言開發的。
GNU編碼風格同樣要求每行代碼的字符不能超過80個,但在排版上和Linux內核的編碼風格有較大的區別,尤其在縮進、空格和大括號的位置方面區別較大。比如下面這段使用GNU編碼風格的代碼:
int lots_of_args (int x, long y, short z, double a_double, float a_float) { int haha = 0; if (x < foo (y, z)) haha = bar[4] + 5; else { while (z) { haha += foo (z, z); z--; } return ++x + bar (); } return haha; }
如果按照Linux內核的編碼風格,則應修改為如下形式:
int lots_of_args(int x, long y, short z, double a_double, float a_float) { int haha = 0; if (x < foo(y, z)) { haha = bar[4] + 5; } else { while (z) { haha += foo(z, z); z--; } haha = ++x + bar(); } return haha; }
除了排版、注釋、語法約定、命名等屬于代碼可讀性范疇的內容,GNU的編碼風格還包括如下方面的一些規定。
(1)系統可移植性:規定了如何處理跨操作系統的可移植性。
(2)處理器可移植性:規定了如何應對不同種類的處理器或處理器架構。
(3)系統函數:規定了如何應對不同平臺在標準函數庫上的差異。
(4)規定了國際化、字符集、引號的使用以及mmap
函數的使用等。
這些規定是經驗性約定,屬于代碼可維護性的范疇。

Win32編碼風格并不像GNU編碼風格或者Linux內核的編碼風格那樣存在一個在線可查閱的版本,而是散見于Win32頭文件以及各種示例程序中。我們可以將Win32編碼風格理解成匈牙利命名法的集大成者。
在開源項目MiniGUI中,由于其API模仿Win32而來,因此其編碼風格極具匈牙利命名法風格。下面是MiniGUI中ShowWindow()
函數的實現代碼。
/* ** This function shows window in behavious by specified iCmdShow. */ BOOL GUIAPI ShowWindow (HWND hWnd, int iCmdShow) { MG_CHECK_RET (MG_IS_NORMAL_WINDOW(hWnd), FALSE); if (IsMainWindow (hWnd)) { ... } else { PCONTROL pControl; pControl = (PCONTROL)hWnd; if (pControl->dwExStyle & WS_EX_CTRLASMAINWIN) { ... } else { switch (iCmdShow) { case SW_HIDE: if (pControl->dwStyle & WS_VISIBLE) { pControl->dwStyle &= ~WS_VISIBLE; InvalidateRect ((HWND)(pControl->pParent), (RECT*)(&pControl->left), TRUE); } break; ... } } if (iCmdShow == SW_HIDE && pControl->pParent->active == pControl) { SendNotifyMessage (hWnd, MSG_KILLFOCUS, 0, 0); pControl->pParent->active = NULL; } } SendNotifyMessage (hWnd, MSG_SHOWWINDOW, (WPARAM)iCmdShow, 0); return TRUE; }
從上述代碼中可以看出,Win32編碼風格的典型特征如下。
● 使用匈牙利命名法命名變量,如上述代碼中的iCmdShow
和pControl
,前者表示整型變量,后者表示指針。
● 使用匈牙利命名法命名函數,如上述代碼中的SendNotifyMessage()
和InvalidateRect()
。
● 較多地使用了類型定義,如上述代碼中的HWND
、BOOL
、WPARAM
、RECT
等;其中的RECT
是一個結構體,它定義了一個矩形的左上角和右下角兩個頂點的坐標。
值得一提的是,上面的代碼對字符數超過80的行做了繞行處理,但Win32編碼風格對這一點并不作硬性限制。畢竟Windows平臺為開發者提供了圖形化的集成開發環境,每行字符超過80個并不會給程序員帶來很大的困擾。另外,由于Win32 API和變量名通常較長,因此一行代碼很容易超過80個字符。
隨著Windows平臺上的主流編程語言從C轉為C++,而后又轉為C#,現在使用Win32編碼風格的C代碼已經相對少見了。
- Implementing VMware Horizon 7(Second Edition)
- Hands-On Machine Learning with scikit:learn and Scientific Python Toolkits
- Java 9 Concurrency Cookbook(Second Edition)
- Learning Linux Binary Analysis
- Java軟件開發基礎
- Oracle BAM 11gR1 Handbook
- C語言程序設計案例精粹
- 正則表達式經典實例(第2版)
- Windows Phone 7.5:Building Location-aware Applications
- 微服務架構深度解析:原理、實踐與進階
- Android移動開發案例教程:基于Android Studio開發環境
- Hadoop 2.X HDFS源碼剖析
- SignalR:Real-time Application Development(Second Edition)
- 零基礎學Java第2版
- Spring Web Services 2 Cookbook