亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

[C++] 編程實踐之1: Google的C++代碼風格7:注釋

2019-11-06 06:03:30
字體:
來源:轉載
供稿:網友

注釋

注釋雖然寫起來很痛苦,但對保證代碼可讀性至關重要。下面的規則描述了如何注釋以及在哪兒注釋。當然也要記?。鹤⑨尮倘缓苤匾?,但最好的代碼本身應該是自文檔化的。有意義的類型名和變量名,要遠勝過要用注釋解釋的含糊不清的名字。

你寫的注釋是給下一個需要理解你的代碼的人看的??犊┌?,下一個人可能就是你!

注釋風格

使用//或者/**/,統一就好。

//或者/**/都可以,但是//更常用。要在如何注釋以及注釋風格上確保統一。

文件注釋

在每一個文件開頭加入版權公告,然后是文件內容描述。

法律公告和作者信息:

每個文件都應該包含以下項,依次是: 版權聲明(比如,Copyright 2008 Google Inc.)許可證。為項目選擇合適的許可證版本(比如Apache 2.0, BSD, LGPL, GPL)作者:標識文件的原始作者如果你對原始作者的文件做了重大修改,將你的信息添加到作者信息里。這樣當其他人對該文件有疑問時可以知道該聯系誰。

文件內容:

緊接著版權許可和作者信息之后,每個文件都要用注釋描述文件內容。通常.h文件要對聲明的類的功能和用法作簡單說明。.cc文件通常包含了更多的實現細節或算法技巧討論,如果你感覺這些實現細節或者算法技巧討論對于理解.h文件有幫助,可以將該注釋挪到.h中,并且在.cc中指出文檔在.h中。不要簡單的在.h和.cc間復制注釋。這種偏離了注釋的實際意義。

類注釋

每個類的定義都要附帶一份注釋,描述類的功能和用法。

// Iterates over the contents of a GargantuanTable. Sample usage:// GargantuanTable_Iterator* iter = table->NewIterator();// for (iter->Seek("foo"); !iter->done(); iter->Next()) {// PRocess(iter->key(), iter->value());// }// delete iter;class GargantuanTable_Iterator { ...};

如果你覺得已經在文件頂部詳細描述了該類,像直接簡單的上來一句“完整描述見文件頂部”也不打緊,但務必確保有這類注釋。

如果類有任何同步前提,文檔說明之。如果該類的實例可被多線程訪問,要特別注意文檔說明多線程環境下相關的規則和常量使用。

函數注釋

函數聲明處注釋描述函數的功能;定義處描述函數實現。

函數聲明:

注釋位于聲明之前,對函數功能及用法進行描述。注釋使用敘述式(”Opens the file”)而非指令式(”Open the file”);注釋只是為了描述函數,而不是命令函數做什么。通常,注釋不會描述函數如何工作。那是函數定義部分的事情。函數聲明處注釋的內容: 函數的輸入輸出。對類成員函數而言,函數調用期間對象是否需要保持引用參數,是否會釋放這些參數。如果函數分配了空間,需要由調用者釋放。參數是否可以被NULL。是否存在函數使用上的性能隱患。如果函數是可重入的,其同步的前提是什么。// Returns an iterator for this table. It is the client's// responsibility to delete the iterator when it is done with it,// and it must not use the iterator once the GargantuanTable object// on which the iterator was created has been deleted.//// The iterator is initially positioned at the beginning of the table.//// This method is equivalent to:// Iterator* iter = table->NewIterator();// iter->Seek("");// return iter;// If you are going to immediately seek to another place in the// returned iterator, it will be faster to use NewIterator()// and avoid the extra seek.Iterator* GetIterator() const;上面給出了一個具體示例。但是也要避免啰啰嗦嗦,或做些顯而易見的說明。注釋構造/析構函數時,切記讀代碼的人知道構造/析構函數是干啥的,所以“destroys this object”這樣的注釋是沒有意義的。注明構造函數對參數做了什么(例如,是否取得指針所有權)以及析構函數清理了什么。如果都是些無關緊要的內容,直接省掉注釋。析構函數前沒有注釋是很正常的。

函數定義:

每個函數定義要用注釋說明函數功能和實現要點。比如說說你用的編程技巧,實現的大致步驟,或者解釋如此實現的理由。為什么前半部分要加鎖而后半部分不需要等等之類的。不要從.h文件或其他地方的函數聲明處直接復制注釋。簡要重述函數功能是可以的,但注釋重點要放在如何實現上。

變量注釋

通常變量名本身足以很好地說明變量用途。但在某些情況下,也需要額外的注釋說明。

類數據成員:

每個類數據成員(也叫實例變量或者成員變量)都應該用注釋說明用途。如果變量可以接受NULL或者-1等警戒值,需要加以說明。private: // Keeps track of the total number of entries in the table. // Used to ensure we do not go over the limit. -1 means // that we don't yet know how many entries the table has. int num_total_entries_;

全局變量:

和數據成員一樣,所有全局變量也要注釋說明含義以及用途。比如:// The total number of tests cases that we run through in this regression test.const int kNumTestCases = 6;

實現注釋

對于代碼中巧妙的,晦澀的,有趣的,重要的地方加以注釋。

代碼前注釋:

巧妙或者復雜的代碼前要加以注釋,比如:// Divide result by two, taking into account that x// contains the carry from the add.for (int i = 0; i < result->size(); i++) { x = (x << 8) + (*result)[i]; (*result)[i] = x >> 1; x &= 1;}

行注釋:

比較晦澀的地方要在行尾加入注釋。在行尾空兩格進行注釋,比如下面的代碼示例。注意這里用了兩段注釋分別描述這段代碼的作用,和提示函數返回時錯誤已經被記錄入日志。// If we have enough memory, mmap the data portion too.mmap_budget = max<int64>(0, mmap_budget - index_->length());if (mmap_budget >= data_size_ && !MmapData(mmap_chunk_bytes, mlock)) return; // Error already logged.如果你需要連續進行多行注釋,可以使之對齊以獲得更好的可讀性:DoSomething(); // Comment here so the comments line up.DoSomethingElseThatIsLonger(); // Comment here so there are two spaces between // the code and the comment.{ // One space before comment when opening a new scope is allowed, // thus the comment lines up with the following comments and code. DoSomethingElse(); // Two spaces before line comments normally.}向函數傳入NULL,布爾值或者整數時,要注釋說明含義,或使用常量讓代碼望文知義。例如對比:// First version:bool success = CalculateSomething(interesting_value, 10, false, NULL); // What are these arguments??// Second version:bool success = CalculateSomething(interesting_value, 10, // Default base value. false, // Not the first time we're calling this.// Third version:const int kDefaultBaseValue = 10;const bool kFirstTimeCalling = false;Callback *null_callback = NULL;bool success = CalculateSomething(interesting_value, kDefaultBaseValue, kFirstTimeCalling, null_callback);

不允許: - 注意永遠不要用自然語言翻譯代碼作為注釋。要假設讀代碼的人C++水平比你高,即使他/她可能不知道你的用意:

// Bad styles:// 現在, 檢查 b 數組并確保 i 是否存在,// 下一個元素是 i+1.... // 天哪. 令人崩潰的注釋.

標點,拼寫和語法

注意標點,拼寫和語法;寫的好的注釋比差的要易讀的多。

注釋的通常寫法是包含正確的大小寫和結尾句號的完整語句。短一點的注釋(如代碼行尾注釋)可以隨意點,但依然要注意風格的一致性。完整的語句可讀性更好,也可以說明該注釋是完整的,而不是一些不成熟的想法。

雖然被別人指出該用分號時卻用了逗號多少有些尷尬,但清晰易讀的代碼還是很重要的。正確的標點,拼寫和語法對此會有幫助。

TODO注釋

對那些臨時的,短期的解決方案,或已經夠好但仍不完美的代碼使用TODO注釋。

TODO注釋要使用全大寫的字符串TODO,在隨后的圓括弧里面寫上你的大名,郵件地址,或其它身份標識。冒號是可選的。主要目的是讓添加注釋的人(也是可以請求提供更多細節的人)可以根據規范的TODO格式進行查找。添加注釋并不意味著你要自己來修正。

// TODO(kl@Gmail.com): Use a "*" here for concatenation Operator.// TODO(Zeke) change this to use relations.

如果TODO是為了在“將來某一天做某事”,可以附上一個非常明確的時間“Fix by November 2005”或者一個明確的事項(例如“Remove this code when all clients can handle xml responses.”)。

棄用注釋

通過棄用注釋(DEPRECATED comments)以標記某接口點(interface points)已棄用。

您可以寫上包含全大寫的DEPRECATED的注釋,以標記某接口為棄用狀態。注釋可以放在接口聲明前,或者同一行。

在DEPRECATED一詞后,留下您的名字,郵箱地址以及括弧補充。

僅僅標記接口為DEPRECATED并不會讓大家不約而同的棄用,您還得親自主動修正調用點(callsites),或者是找個幫手。

修正好的代碼應該不會再設計棄用接口點了,著實改用新接口點。如果您不知從何下手,可以找標記棄用注釋的當事人一起商量。

總結

關于注釋風格,很多C++的coders更喜歡行注釋,C coders或許對塊注釋依然情有獨鐘,或者在文件頭大段大段的注釋時使用塊注釋。文件注釋可以炫耀你的成就,也是為了捅了簍子了別人可以找你。注釋要言簡意賅,不要拖沓冗余,復雜的東西簡單化和簡單的東西復雜化都是要被鄙視的。對于Chinese coders來說,用英文注釋還是用中文注釋,it is a problem,但不管怎樣,注釋時為了讓別人看懂,難道是為了炫耀編程語言之外你的沐浴或者外語水平嗎?注釋不要太亂,適當的縮進才會讓人樂意看。但也沒有必要規定注釋從第幾列開始(我自己寫代碼的時候總喜歡這樣)UNIX/linux下還可以約定是使用tab還是space,個人傾向于space。TODO很不錯,有時候,注釋確實是為了標記一些未完成或者完成不盡如人意的地方,這樣一搜索,就知道還有哪些活要干,日志都省了。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线亚洲在线| 日本精品久久电影| 久久99久久久久久久噜噜| 综合网中文字幕| 91免费高清视频| 欧美成人午夜激情视频| 日韩av综合网| 国产精品久久久久高潮| 九九热精品视频国产| 国产成人亚洲综合| 91亚洲精品视频| 国产不卡在线观看| 91在线免费视频| 欧美洲成人男女午夜视频| 亚洲男女性事视频| 欧美激情欧美激情在线五月| 97在线看免费观看视频在线观看| 夜夜狂射影院欧美极品| 97香蕉超级碰碰久久免费软件| 国产成人久久久| 国模私拍一区二区三区| 久久久99久久精品女同性| 欧美激情videoshd| 久久成人人人人精品欧| 国产精品久久久久99| 亚洲欧美日韩图片| 国产精自产拍久久久久久| 国产精品旅馆在线| 中文字幕亚洲二区| 欧美国产视频日韩| 国产91精品久久久久久| 国产日韩欧美成人| 成人激情视频网| 中文字幕精品一区二区精品| 中文字幕亚洲欧美日韩2019| 国产精品成熟老女人| 久久久久久久久久久成人| 亚洲影院高清在线| 欧美孕妇毛茸茸xxxx| 精品国内自产拍在线观看| 亚洲色图色老头| 色狠狠av一区二区三区香蕉蜜桃| 日韩成人在线网站| 久色乳综合思思在线视频| 国产极品精品在线观看| 欧美日韩精品国产| 亚洲精品一区二区在线| 一本色道久久综合狠狠躁篇怎么玩| 成人午夜激情网| 欧美中文在线观看| 成人免费在线网址| 亚洲一区二区中文字幕| 国产91精品久久久| 在线观看国产精品日韩av| 久久精品福利视频| 黄色一区二区在线观看| 午夜免费久久久久| 精品国产区一区二区三区在线观看| 久久久久久久久久国产| 中文字幕精品一区二区精品| 91免费在线视频| 欧美成人亚洲成人日韩成人| 国外成人免费在线播放| 欧美最顶级丰满的aⅴ艳星| 中文字幕亚洲欧美一区二区三区| 亚洲欧洲一区二区三区在线观看| 亚洲精品456在线播放狼人| 日韩精品一区二区三区第95| 国语自产精品视频在线看一大j8| 国内精品美女av在线播放| 欧美日韩国内自拍| 亚洲色图美腿丝袜| 欧美成人精品影院| 美女视频久久黄| 欧美精品第一页在线播放| 午夜精品久久久久久久久久久久| 国产欧美亚洲精品| 国产一区二区三区在线观看网站| 美女撒尿一区二区三区| 日本91av在线播放| 91免费精品视频| 欧美性色19p| 久久久久久久久91| 国产精品福利无圣光在线一区| 国产91在线播放九色快色| 在线日韩欧美视频| 日韩av免费看| 亚洲精品91美女久久久久久久| 在线日韩av观看| 最新的欧美黄色| xx视频.9999.com| 自拍偷拍亚洲区| 成人在线小视频| 性色av香蕉一区二区| 久久久久北条麻妃免费看| 在线a欧美视频| 精品视频一区在线视频| 91系列在线观看| 国产午夜精品久久久| 7777精品视频| 欧美成人第一页| 亚洲精品aⅴ中文字幕乱码| 国产欧美va欧美va香蕉在线| 国产成人精品网站| 国产精品欧美激情在线播放| 久久综合免费视频影院| 久久久亚洲欧洲日产国码aⅴ| 色综合91久久精品中文字幕| 国产欧美一区二区三区在线看| 久久精品成人欧美大片| 欧美另类69精品久久久久9999| 77777少妇光屁股久久一区| xxx成人少妇69| 成人欧美在线观看| 久久香蕉精品香蕉| 91大神在线播放精品| 国产日产欧美精品| 欧美激情xxxx| 91九色在线视频| 97国产精品视频人人做人人爱| 国产免费一区二区三区香蕉精| 成人国产亚洲精品a区天堂华泰| 国产精品网站入口| 色综合91久久精品中文字幕| 91久久精品美女| 92福利视频午夜1000合集在线观看| 久久综合久久美利坚合众国| 国产精品久久久久国产a级| 夜夜嗨av色综合久久久综合网| 国产成人avxxxxx在线看| 日韩一级裸体免费视频| 欧美午夜片在线免费观看| 精品国产一区二区三区在线观看| 高清亚洲成在人网站天堂| 亚洲资源在线看| 久久中文字幕一区| 亚洲视频在线观看网站| 久久久久久久电影一区| 亚洲午夜女主播在线直播| 国产精品自产拍在线观看中文| 日韩中文在线中文网在线观看| 精品久久中文字幕| 欧美成人免费全部| 久久久久久久久国产| 91欧美精品午夜性色福利在线| 欧美激情在线观看视频| 欧美日韩在线视频观看| 欧美激情精品久久久| 欧美激情欧美激情在线五月| 欧美一区二区三区艳史| 国产日韩欧美在线| 久久精品成人动漫| 亚洲国产美女精品久久久久∴| 日韩在线观看av| 91探花福利精品国产自产在线| 国产一区二区在线播放| 国产精品自产拍在线观| 欧美巨猛xxxx猛交黑人97人| 日韩精品中文字幕视频在线| 欧美激情一二区| 精品露脸国产偷人在视频| 欧美高跟鞋交xxxxhd| 日韩国产精品亚洲а∨天堂免| 国产午夜精品一区二区三区|