在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ 0x04 C代碼規(guī)范
0x0E-單線程備份(下)
0x11-套接字編程-1
0x05-C語言指針:(Volume-1)
0x13-套接字編程-HTTP服務(wù)器(1)
0x0C-開始行動
C 語言進階
第一部分
0x05-C語言指針(Volume-2)
0x08-C語言效率(下)
0x07-C語言效率(上)
0x04 C代碼規(guī)范
0x0F-多線程備份
0x05-C語言變量
第四部分
0x16-套接字編程-HTTP服務(wù)器(4)
0x0D-單線程備份(上)
總結(jié)
0x01-C語言序言
0x15-套接字編程-HTTP服務(wù)器(3)
0x14-套接字編程-HTTP服務(wù)器(2)
0x17-套接字編程-HTTP服務(wù)器(5)
第三部分
我的C語言
0x06-C語言預(yù)處理器
0x09-未曾領(lǐng)略的新風(fēng)景
0x0A-C線程和Glib的視角
第二部分
0x10-網(wǎng)絡(luò)的世界
0x12-套接字編程-2
0x03-C代碼
0x0B-C語言錯誤處理

0x04 C代碼規(guī)范

0x04 C代碼規(guī)范

  1. 命名

    • 只要提到代碼規(guī)范,就不得不說的一個問題。
    • 在一些小的演示程序中,也許費盡心思去構(gòu)思一個 命名 是一件十分傻的行為,但是只要程序上升到你需要嚴(yán)正設(shè)計,思考,復(fù)查的層次,你就需要好好考慮 命名 這個問題。
    • 函數(shù)命名:

      • C語言中,我們可以讓下劃線或者詞匯幫助我們表達函數(shù)功能:

        1. 前綴:
          1. set 可以表示設(shè)置一個參數(shù)為某值
          2. get 可以表示獲取某一個參數(shù)的值
          3. is 可以表示詢問是否是這種情況
        2. 后綴:

          1. max/min 可以表示某種操作的最大(小)次數(shù)
          2. cnt 可以表示當(dāng)前的操作次數(shù)
          3. key 某種關(guān)鍵值

                      size_t get_counts();
                      size_t retry_max();
                      int    is_empty();
      • 需要注意的只是,不要讓命名過于贅述其義,只簡單保留動作以及目的即可,詳細功能可以通過文檔來進行進一步的解釋。
    • 結(jié)構(gòu)體命名:

      • 由于結(jié)構(gòu)體的 標(biāo)簽,不會污染命名,即標(biāo)簽不在命名搜索范圍之內(nèi),所以可以放心使用:

        1. 有人習(xí)慣使用 typedef, 而有人喜歡使用 struct tag obj,后者比較多,但是前者也不失為一種好方法,仁者見仁智者見智。

                  /*方法1*/
                  struct inetaddr_4{
                          int    port;
                          char * name;
                  };
                  struct inetaddr_4 *addr_info;
                  /*方法2*/
                  typedef struct _addr{
                          int    port;
                          char * name;
                  }inetaddr_4;
                  inetaddr_4 *addr_info_2;    
          兩者同處一個文件內(nèi)亦不會發(fā)生編譯錯誤。 
    • 變量命名

      • 所有字符都使用小寫
      • 含義多的可以用 _ 進行輔助
      • = 為標(biāo)準(zhǔn)進行對齊
      • 類型, 變量名左對齊。
      • 等號左右兩端,最少有一個空格。

              int main(void)
              {
                  int          counts = 0;
                  inetaddr_4   *addr  = NULL;
        
                  return 0;
              }

        為了防止指針聲明定義時候出錯,將 * 緊貼著變量名總不會出錯。

              inetaddr_4   *addr, object, *addr_2;

        其中 addraddr_2 是指針,而 object 則是一個棧上的完整對象,并不是指針。

      • 全局變量能少用就少用,必須要用的情況下,可以考慮添加前綴 g_

              int g_counts;
    • #define 命名

      • 所有字符都是用大寫,并用 _ 進行分割
      • 如果多于一個語句,使用 do{...}while(0) 進行包裹,防止 ; 錯誤。

              #define SWAP(x, y)      \
              do{                     \
                  x = x + y;      \
                  y = x - y;          \
                  x = x - y;          \
              }while(0)

        當(dāng)然這個交換宏實際上有一點缺陷,在大后方會提出。此處是代碼規(guī)范,就不重復(fù)強調(diào)。

    • enum 命名
      • 所有字符都是用大寫,并用 _ 進行分割
      • define 相比,enum適用于同一類型的常量聲明,而不是單一獨立的常量。往往出現(xiàn)都是成組。
  2. 格式化代碼

    • 花括號 {}

      • 混合使用符合節(jié)儉思想,但會稍微有一點結(jié)構(gòu)紊亂。
      • 單一使用能更好讓代碼結(jié)構(gòu)清晰。
      • 所謂混合,單一指的是是否一直使用 {} 進行代碼包裹。
      • 有人認為 當(dāng)單一語句的時候不必要添加 {},有的人則習(xí)慣添加
      • 當(dāng)作用域超過一個屏幕的時候,可以適當(dāng)?shù)氖褂米⑨寔碇该?{} 作用域

              while(1){
                  if(tmp == NULL){
                      break;
                  }
                  else if(fanny == 1){
                      ... 大概超過了一個屏幕的代碼
                  } /*else if fanny*/
              }/*end while*/

        如果是代碼量少的情況下,但嵌套比較多,也可以使用這個方式進行注釋。

    • 括號 ()

      • 有人建議除了函數(shù)調(diào)用以外,在條件語句等類似情況下使用 () 要在關(guān)鍵字后空一格,再接上 ()語句,對于這一點,我個人習(xí)慣是不空格,但總有這種說法。

              if (space == NULL) {
                  /**TODO**/
              }
              while(1){
                  /**我習(xí)慣于如此寫**/
              }
              strcpy(str1, str2); /**第一種寫法是為了和函數(shù)調(diào)用寫法進行區(qū)分**/
              return 0;
    • switch

      • 一定要放一個 default 在最后,即使它永遠不會用到。
      • 每個 case 如果需要使用新變量,可以用 {} 包裹起來,并在里面完成所有操作。

              switch(...)
              {
                  case 1:
                      /**TODO**/
                      break;
        
                  case 2:
                  {
                      int new_vari;
                      /**創(chuàng)建新變量則用 {} 包裹起來**/
                  }
                  break;
        
                  default:
                      call_error();
              }
    • goto

      • 雖然許多人,許多書都提醒不再使用 goto 關(guān)鍵字,而是使用 setjmplongjmp來取代它,但是這還是那句話,仁者見仁智者見智,如果 goto 能夠讓代碼清晰,那何樂而不為呢,這個觀點也是最近才體會到的(并非我一己之言)。
      • 具體使用可以查詢官方文檔。
    • 語句

      • 應(yīng)該讓完整的語句在每一行中,只出現(xiàn)一次。
      • 對于變量聲明定義亦是如此
      • 原因是這樣能讓文檔更有針對性
    • 頭文件保護

      • 對于頭文件而言,在一個程序中有可能被多次包含(#include),如果缺少頭文件保護,則會發(fā)生編譯錯誤
      • 不要將 _ 作為宏的開頭或者結(jié)尾。

              #ifndef VECTOR_H_INCLUDE
                  #define VECTOR_H_INCLUDE
                      /**TODO**/
                  #endif 
    • C語言的宏有諸多弊端,所以盡量使用 inline 函數(shù)來代替宏。在大后方會有解釋
    • 但是,請不要因此拋棄了宏,比如在 C11 中有一個新興的宏。
  3. 變量

    • 第一時刻初始化所有所聲明的變量,因為這么做總沒有壞處,而且能減少出錯的可能。
  4. 函數(shù)

    • 函數(shù)應(yīng)該盡可能的短小,一個ANSI屏幕的為最佳。
  5. 如果某個循環(huán)帶著空語句,使用 {} 進行掛載,以免出現(xiàn)意外。

      while(*is_end++ != '\0')
      {
          ;
      }

    雖然是空的循環(huán)體,但是寫出來以免造成誤循環(huán)。

  6. 盡量不要讓函數(shù)返回值直接作為條件語句的判斷,這樣會極大降低可讀性

      if(is_eof(file) == 0)
          好過
      if(!is_eof(file))
  7. 不要為了方便或者一點點的所謂速度提升(也許根本沒有),而放棄可讀性,使用嵌入式的賦值語句

      int add = 10;
      int num = 11;
      int thr = 20;
      add = add + thr;
      num = add + 20;
          不要寫成
      num = (add = add + thr) + 20;

浮點數(shù)

  • 萬萬記住不要再使用浮點數(shù)比較彼此是否相等或不等。
  • 如果把浮點數(shù)用在離散性的數(shù)據(jù)上,比如循環(huán)計數(shù)器,那就等死吧。

其他

  • 使用 #if 而不是 #ifdef
  • 可以使用 define() 來代替 #ifdef的功能

      #if !define(USERS_DEFINE)
          #define USERS_DEFINE ...
      #endif
  • 對于某些大段需要消除的代碼,我們不能使用注釋 /**/,因為注釋不能內(nèi)嵌著注釋(//除外),我們可以使用黑魔法:

      #if NOT_DECLARATION
          /**想要注釋的代碼**/
      #endif
  • 不要使用純數(shù)字
    • 意味著,不在使用毫無標(biāo)記的數(shù)字,因為可能你過了幾個月再看源代碼的時候,你根本不知道這個數(shù)字代表著什么
    • 而應(yīng)該使用#define 給它一個名字,來說明這個數(shù)字的意義。
上一篇:0x07-C語言效率(上)下一篇:第一部分