官术网_书友最值得收藏!

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編碼風格的典型特征如下。

使用匈牙利命名法命名變量,如上述代碼中的iCmdShowpControl,前者表示整型變量,后者表示指針。

使用匈牙利命名法命名函數,如上述代碼中的SendNotifyMessage()InvalidateRect()

較多地使用了類型定義,如上述代碼中的HWNDBOOLWPARAMRECT等;其中的RECT是一個結構體,它定義了一個矩形的左上角和右下角兩個頂點的坐標。

值得一提的是,上面的代碼對字符數超過80的行做了繞行處理,但Win32編碼風格對這一點并不作硬性限制。畢竟Windows平臺為開發者提供了圖形化的集成開發環境,每行字符超過80個并不會給程序員帶來很大的困擾。另外,由于Win32 API和變量名通常較長,因此一行代碼很容易超過80個字符。

隨著Windows平臺上的主流編程語言從C轉為C++,而后又轉為C#,現在使用Win32編碼風格的C代碼已經相對少見了。

主站蜘蛛池模板: 丹寨县| 岳西县| 两当县| 黎川县| 什邡市| 茶陵县| 凤山县| 康马县| 犍为县| 吉安市| 永和县| 纳雍县| 遵义县| 和平区| 博湖县| 泰和县| 如东县| 高清| 余姚市| 扎赉特旗| 琼中| 扶风县| 高要市| 土默特左旗| 思茅市| 嘉荫县| 洛浦县| 胶州市| 库车县| 房产| 乐陵市| 澜沧| 桐柏县| 怀仁县| 临湘市| 邹平县| 峨眉山市| 肇州县| 五河县| 连云港市| 汉源县|