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

鍍金池/ 教程/ C/ 0x04 C代碼規(guī)范
0x0E-單線程備份(下)
0x11-套接字編程-1
0x05-C語言指針:(Volume-1)
0x13-套接字編程-HTTP服務(wù)器(1)
0x0C-開始行動(dòng)
C 語言進(jìn)階
第一部分
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語言錯(cuò)誤處理

0x04 C代碼規(guī)范

0x04 C代碼規(guī)范

  1. 命名

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

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

        1. 前綴:
          1. set 可以表示設(shè)置一個(gè)參數(shù)為某值
          2. get 可以表示獲取某一個(gè)參數(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ǎn)單保留動(dòng)作以及目的即可,詳細(xì)功能可以通過文檔來進(jìn)行進(jìn)一步的解釋。
    • 結(jié)構(gòu)體命名:

      • 由于結(jié)構(gòu)體的 標(biāo)簽,不會(huì)污染命名,即標(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;    
          兩者同處一個(gè)文件內(nèi)亦不會(huì)發(fā)生編譯錯(cuò)誤。 
    • 變量命名

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

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

        為了防止指針聲明定義時(shí)候出錯(cuò),將 * 緊貼著變量名總不會(huì)出錯(cuò)。

              inetaddr_4   *addr, object, *addr_2;

        其中 addraddr_2 是指針,而 object 則是一個(gè)棧上的完整對(duì)象,并不是指針。

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

              int g_counts;
    • #define 命名

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

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

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

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

    • 花括號(hào) {}

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

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

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

    • 括號(hào) ()

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

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

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

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

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

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

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

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

    • 第一時(shí)刻初始化所有所聲明的變量,因?yàn)檫@么做總沒有壞處,而且能減少出錯(cuò)的可能。
  4. 函數(shù)

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

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

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

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

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

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

浮點(diǎn)數(shù)

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

其他

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

      #if !define(USERS_DEFINE)
          #define USERS_DEFINE ...
      #endif
  • 對(duì)于某些大段需要消除的代碼,我們不能使用注釋 /**/,因?yàn)樽⑨尣荒軆?nèi)嵌著注釋(//除外),我們可以使用黑魔法:

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