C,C++編程風格(1)


出處:http://blog.csdn.net/han_xiaoyang/article/details/10473845

前言

    眼看着又要到一年一度的找工作季了,遙想去年這會兒,學校同學們也都是一副要上戰場似得枕戈待旦整裝待發的情景。想來自己當時筆試面試也確實參加了不少,無奈技術和智商平平,最后結果一般,但也確實經歷了不少,外加一直有總結和整理資料的小習慣,手頭上確實攢下了一些筆試面試的資源。又最近頻繁有師弟師妹問我要相關的資料,想來還不如自己整理整理發到博客里,大家都能看看,希望能有一些幫助吧。

第一部分 C/C++編程基礎

    這部分內容大部分來自林銳博士01年寫的高質量C++/C編程指南,距今已經十多年了,但是我依舊清晰地記得師兄當初介紹這本幾十頁的書給我,看后的驚艷,確切的說來,這本書讓我的編程風格編程習慣以及對C++/C的認識有了大的提升(這個說來尷尬了,本人屬於木有任何天賦的程序員,和大牛們差幾百個檔,之前寫的程序只能用慘不忍睹來形容,即使現在可能也只屬於勉強能看)。直至后來參加大大小小的筆試面試,發現里面考察略深一點點的C++/C基礎知識在書里面都能看到;而后來參加某互聯網公司面試,當場寫算法程序時,被面試官誇過編程習慣和編程風格非常好(介個,其實也有可能是剛好對上面試官胃口罷了...),我再一次意識到,這份資料確實是不錯的,所以這里打算整理整理,發到博客上共享一下,已經看過和熟知的童鞋或者大牛們自行繞開吧。

今天寫的這部分,大體上都是關於編程風格和編程習慣的,C/C++基礎和注意點下次再說吧。

正題

一、文件結構

1.1版權版本聲明

       我看過一些寫的比較詳細正統的頭文件和定義文件的開頭都有這部分。具體包括以下內容:

       1) 版權信息。 

       2) 文件名稱,標識符,摘要。 

       3) 當前版本號,作者/ 修改者,完成日期。 

       4 )版本歷史信息。 

1.2 關於頭文件

       1)為了防止頭文件被重復引用,應當用ifndef /define/ endif 結構產生預處理塊。

       2)用#include <filename.h>  格式來引用標准庫的頭文件,用#include “filename .h”格式來引用非標准庫的頭文件。

       3)頭文件中只存放“聲明”而不存放“定義”

       示例:

       #ifndef GRAPHICS_H  //  防止graphics.h 被重復引用 

       #define GRAPHICS_H 

 

       #include <math.h>    //  引用標准庫的頭文件 

       … 

       #include  “ m yheader.h”   //  引用非標准庫的頭文件 

       … 

       void Function1( …); //  全局函數聲明 

       … 

       class Box         //  類結構聲明 

       { 

       … 

       }; 

       #endif

1.3 頭文件作用

       1) 通過頭文件來調用庫功能。

       2) 頭文件能加強類型安全檢查。

二、程序的板式

2.1空行

       建議:

       1)在每個類聲明之后、每個函數定義結束之后都要加空行。

       2)在一個函數體內,邏揖上密切相關的語句之間不加空行,其它地方應加空行分隔。

       示例如下圖左右所示:

2.2 代碼行

       建議:

       1)一行代碼只做一件事情,如只定義一個變量,或只寫一條語句。這樣的代碼容易閱讀,並且方便於寫注釋。

       2)if、for、while、do等語句自占一行,執行語句不得緊跟其后。不論執行語句有多少都要加{}。這樣可以防止書寫失誤。

       例如下圖中左側為風格良好的代碼,右側為風格糟糕的代碼。

       3)盡可能在定義變量的同時初始化該變量,以減少安全隱患。

2.3 代碼行內的空格

         1)關鍵字(const、virtual、inline、case、if、for、while)之后要留空格。而函數名之后不要留空格,緊跟左括號‘(’,以與關鍵字區別。 

         2)‘(’向后緊跟,不留空格;‘)’、‘,’、‘; ’向前緊跟,不留空格。‘,’、‘; ’后接空格。 

         3)二元操作符(“= ”、“+=”  “>=”、“<=”、“+ ”、“* ”、“% ”、“&&”、“|| ”、“&lt;<”, “^ ”)前后應當加空格。 一元操作符(“! ”、“~ ”、“++”、“-- ”、“& ”)前后不加空格。 

         4)對於表達式比較長的for 語句和if 語句,為了緊湊起見可以適當地去掉一些空格,如for (i=0; i<10; i++) 和if ((a<=b) && (c<=d)) 

       示例如下:

2.4 對齊

       1)程序的分界符‘{ ’和‘} ’應獨占一行並且位於同一列,同時與引用它們的語句左對齊。

       2){ }之內的代碼塊在‘{ ’右邊數格處左對齊。

2.5 修飾符的位置

     這里的修飾符主要指 * 和 &,事實上關於它們應該靠近數據類型還是變量名,一直都有爭議。將修飾符 *  靠近數據類型,例如:i nt*  x;  比較直觀,但同時在某些情況下也容易引起誤解(例i nt*   x, y中的y容易被誤解為指針變量)。所以這里:

       建議大家在寫程序時將修飾符 * 和 & 緊靠變量名。

       所以:

       int  *x,  y;  //  此處y不會被誤解為指針

2.6 注釋

     C 語言的注釋符為“/*… * / ”。C++ 語言中,程序塊的注釋常采用“/*… * / ”,行注釋一般采用“//… ”。注釋的主要作用是:

       1)版本、版權聲明; 

       2)函數接口說明; 

       3)重要的代碼行或段落提示

       一個示例如下圖所示:

三、命名規則

    關於變量和函數等的命名,程序員會有自己的認識和習慣,沒有一種命名規則可以讓所有的程序員贊同,重要的是要保持一致的風格。這個地方,比較著名的一種寫法是Microsoft公司的“匈牙利”法。

       主要命名規則總結如下:

       1)類名和函數名用大寫字母開頭的單詞組合而成。

       例如: 

       class  Node;     //   類名 

       class  LeafNode;    //   類名 

       void  Draw(void);      //  函數名 

       void  SetValue(int value); //  函數名

       2)變量和參數用小寫字母開頭的單詞組合而成。

       例如: 

       BOOL flag; 

       int  drawMode; 

       3)常量全用大寫的字母,用下划線分割單詞。

       例如: 

       const int MAX = 100; 

       const int MAX_LENGTH = 100;

       4)靜態變量加前綴s_ (表示static)。 

       例如: 

       void Init(…) 

       { 

         static int s_initValue;  //  靜態變量 

        … 

       }

       5)如果不得已需要全局變量,則使全局變量加前綴g_(表示global )。

       例如: 

       int g_howMany People;  //  全局變量 

       int g_howMuchMoney ;   //  全局變量 

       6)類的數據成員加前綴m_(表示member ),這樣可以避免數據成員與成員函數的參數同名。

       例如: 

        void Object::SetValue(int width, int height) 

        { 

              m_width = width; 

              m_height = height; 

        }

       有以下共同規則:

       1. 標識符應當直觀且可以拼讀,可望文知意,不必進行“解碼”。用詞要恰當,莫把CurrentValue 寫成NowValue 。

       2. 標識符的長度應當符合“min-length && max-information”原則。即最短的程度表達最多的信息。

       3. 命名規則盡量與所采用的操作系統或開發工具的風格保持一致。例如Windows中用AddChild。而Unix 中用add_child 。

       4. 程序中不要出現僅靠大小寫區分的相似的標識符。例int  x,  X; void foo(int x)和void FOO(float x)是不好的命名方式。

       5. 變量的名字應當使用“名詞”或者“形容詞+名詞”。例float  oldValue;和float  newV alue;

       6. 全局函數的名字應當使用“動詞”或者“動詞+名詞”(動賓詞組)。例DrawBox(); box->Draw(); 

       7. 用正確的反義詞組命名具有互斥意義的變量或相反動作的函數等。例 int minValue; int maxValue; int SetValue(…); int GetValue(…);

 

 

轉載 http://blog.csdn.net/han_xiaoyang/article/details/10473845


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM