中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言和C++的命名規范以及常見命名法

發布時間:2021-09-06 17:06:01 來源:億速云 閱讀:660 作者:chen 欄目:編程語言

本篇內容介紹了“C語言和C++的命名規范以及常見命名法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1.命名規范

  本系列的第一篇,命名風格本就是有關藝術審美,沒有美與丑的絕對標準,本文難免帶有主觀選擇傾向,但是會盡量保持客觀的態度歸納幾種主流的命名風格,僅供參考。制定規范是為了方便團隊溝通和利于代碼維護,雖然并不能符合每個藝術家的胃口。對于獨立開發者,花點時間設計自己的編碼風格也是有助于提高能力的,至少可以在看到自己代碼的時候感覺美美噠~~。本文參考了<Google C++ 風格指南>,<Qt 編碼風格>,當然還有維基百科,以后不累述。

1.1.常見命名法

蛇形命名法 [snake_case]:

  like_this,常見于Linux內核,C++標準庫,Boost以及Ruby,Rust等語言。

駝峰命名法 [camelCase]:

  likeThis,為了和帕斯卡命名法區分,本文特指小駝峰式命名法,常見于Qt以及Java。

帕斯卡命名法[PascalCase]:

  LikeThis,又名大駝峰式命名法,常見于Windows API函數以及C#。

匈牙利命名法[Hungarian notation]:

  dwWidth,系統匈牙利命名法是被黑的最多的,主要認為在有類型檢查的語言里發現類型錯誤編譯器比人更可靠;在有IDE的情況下,找到一個變量的類型也不是一件難事;通常我們看到一個陌生的變量的時候,如果不知道它是干什么的,知道它的類型好像也并沒有什么用;并且在重構的時候,如果你要改變一個變量的類型,盡管其功能并沒有變,你還是要去修改變量名。所以除非是Windows系統開發,不建議使用系統匈牙利命名法。

  rwPosition,匈牙利應用命名法不表示變量的類型,而是用前綴表示變量的目的,或者它代表了什么。這種變量命名方法在幫助程序員理解變量的用途上是很有幫助的。但是建議前綴不要使用縮寫,除非所用的縮寫是普遍共識。

C是一門樸素的語言,你使用的命名也應該這樣。與Modula-2和Pascal程序員不同,C程序員不使用諸如“ThisVariableIsATemporaryCounter”這樣“聰明”的名字。C程序員應該叫它“tmp”,這寫起來更簡單,也不會更難懂。
然而,當面對復雜情況時就有些棘手,給全局變量取一個描述性的名字是必要的。把一個全局函數叫做“foo”是一種目光短淺的行為。全局函數也一樣,如果你有一個統計當前用戶個數的函數,應當把它命名為“count_active_user()”或者簡單點些的類似名稱,不應該命名為“cntusr()”。

1、三種流行的命名法則

目前,業界共有四種命名法則:駝峰命名法、匈牙利命名法、帕斯卡命名法和下劃線命名法,其中前三種是較為流行的命名法。

(1)駝峰命令法。正如它的名稱所表示的那樣,是指混合使用大小寫字母來構成變量和函數的名字。例如,下面是分別用駱駝式命名法和下劃線法命名的同一個函數:
printEmployeePaychecks();
print_employee_paychecks();

第一個函數名使用了駝峰命名法,函數名中的每一個邏輯斷點都有一個大寫字母來標記。第二個函數名使用了下劃線法,函數名中的每一個邏輯斷點都有一個下劃線來標記。

駝峰命名法近年來越來越流行了,在許多新的函數庫和Microsoft Windows這樣的環境中,它使用得當相多。另一方面,下劃線法是C出現后開始流行起來的,在許多舊的程序和UNIX這樣的環境中,它的使用非常普遍。

(2)匈牙利命名法。廣泛應用于象Microsoft Windows這樣的環境中。Windows 編程中用到的變量(還包括宏)的命名規則為匈牙利命名法,這種命名技術是由一位能干的 Microsoft 程序員查爾斯-西蒙尼(Charles Simonyi) 提出的。

匈牙利命名法通過在變量名前面加上相應的小寫字母的符號標識作為前綴,標識出變量的作用域、類型等。這些符號可以多個同時使用,順序是先m_(成員變量)、再指針、再簡單數據類型、再其它。這樣做的好處在于能增加程序的可讀性,便于對程序的理解和維護。

例如:m_lpszStr, 表示指向一個以0字符結尾的字符串的長指針成員變量。
匈牙利命名法關鍵是:標識符的名字以一個或者多個小寫字母開頭作為前綴;前綴之后的是首字母大寫的一個單詞或多個單詞組合,該單詞要指明變量的用途。

(3)帕斯卡(pascal)命名法。與駝峰命名法類似,二者的區別在于:駝峰命名法是首字母小寫,而帕斯卡命名法是首字母大寫,如:
DisplayInfo();
string UserName;

二者都是采用了帕斯卡命名法。

(4)三種命名規則的小結:MyData就是一個帕斯卡命名的示例;myData是一個駝峰命名法,它第一個單詞的第一個字母小寫,后面的單詞首字母大寫,看起來像一個駱駝;iMyData是一個匈牙利命名法,它的小寫的i說明了它的型態,后面的和帕斯卡命名相同,指示了該變量的用途。

2、命名的基本原則

(1)標識符的命名要清晰、明了,有明確含義,同時使用完整的單詞或大家基本可以理解的縮寫,避免使人產生誤解——盡量采用采用英文單詞或全部中文全拼表示,若出現英文單詞和中文混合定義時,使用連字符“_”將英文與中文割開。較短的單詞可通過去掉“元音”形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮寫;一些單詞有大家公認的縮寫。例如:temp->tmp、flag->flg、statistic->stat、increment->inc、message->msg等縮寫能夠被大家基本認可。

(2)命名中若使用特殊約定或縮寫,則要有注釋說明。應該在源文件的開始之處,對文件中所使用的縮寫或約定,特別是特殊的縮寫,進行必要的注釋說明。

(3)自己特有的命名風格,要自始至終保持一致,不可來回變化。個人的命名風格,在符合所在項目組或產品組的命名規則的前提下,才可使用。(即命名規則中沒有規定到的地方才可有個人命名風格)。

(4)對于變量命名,禁止取單個字符(如i 、j 、k... ),建議除了要有具體含義外,還能表明其變量類型、數據類型等,但i 、j 、k 作局部循環變量是允許的。變量,尤其是局部變量,如果用單個字符表示,很容易敲錯(如i寫成j),而編譯時又檢查不出來,有可能為了這個小小的錯誤而花費大量的查錯時間。

(5)除非必要,不要用數字或較奇怪的字符來定義標識符。

(6)命名規范必須與所使用的系統風格保持一致,并在同一項目中統一。

(7)在同一軟件產品內,應規劃好接口部分標識符(變量、結構、函數及常量)的命名,防止編譯、鏈接時產生沖突。對接口部分的標識符應該有更嚴格限制,防止沖突。如可規定接口部分的變量與常量之前加上“模塊”標識等。

(8)用正確的反義詞組命名具有互斥意義的變量或相反動作的函數等。

下面是一些在軟件中常用的反義詞組。
add / remove begin / end create / destroy
insert / delete first / last g et / release
increment / decrement put / get
add / delete lock / unlock open / close
min / max old / new start / stop
next / previous source / target show / hide
send / receive source / destination
cut / paste up / down

示例:
int min_sum;
int max_sum;
int add_user( BYTE *user_name );
int delete_user( BYTE *user_name );

(9)除了編譯開關/ 頭文件等特殊應用,應避免使用_EXAMPLE_TEST_ 之類以下劃線開始和結尾的定義。

3、變量名的命名規則

(1)變量的命名規則要求用“匈牙利法則”。
即開頭字母用變量的類型,其余部分用變量的英文意思、英文的縮寫、中文全拼或中文全拼的縮寫,要求單詞的第一個字母應大寫。
即: 變量名=變量類型+變量的英文意思(或英文縮寫、中文全拼、中文全拼縮寫)
對非通用的變量,在定義時加入注釋說明,變量定義盡量可能放在函數的開始處。
見下表:
bool 用b開頭 bFlg
int 用i開頭 iCount
short int 用n開頭 nStepCount
long int 用l開頭 lSum
char 用c開頭 cCount
unsigned char 用by開頭
float 用f開頭 fAvg
double 用d開頭 dDeta
unsigned int(WORD) 用w開頭 wCount
unsigned long int(DWORD) 用dw開頭 dwBroad
字符串 用s開頭 sFileName
用0結尾的字符串 用sz開頭 szFileName

(2)指針變量命名的基本原則為:
對一重指針變量的基本原則為:“p”+變量類型前綴+命名,如一個float*型應該表示為pfStat。對二重指針變量的基本規則為:“pp”+變量類型前綴+命名。對三重指針變量的基本規則為:“ppp”+變量類型前綴+命名。

(3)全局變量用g_開頭,如一個全局的長型變量定義為g_lFailCount。即:變量名=g_+變量類型+變量的英文意思(或縮寫)。此規則還可避免局部變量和全局變量同名而引起的問題。

(4)靜態變量用s_開頭,如一個靜態的指針變量定義為s_plPerv_Inst。即: 變量名=s_+變量類型+變量的英文意思(或縮寫)

(5)對枚舉類型(enum)中的變量,要求用枚舉變量或其縮寫做前綴。并且要求用大寫。如:
enum cmEMDAYS
{
EMDAYS_MONDAY;
EMDAYS_TUESDAY;
……
};

(6)對struct、union變量的命名要求定義的類型用大寫。并要加上前綴,其內部變量的命名規則與變量命名規則一致。

結構一般用S開頭,如:
struct ScmNPoint
{
int nX;//點的X位置
int nY; //點的Y位置
};

聯合體一般用U開頭,如:
union UcmLPoint
{
LONG lX;
LONG lY;
}

(7)對常量(包括錯誤的編碼)命名,要求常量名用大寫,常量名用英文表達其意思。當需要由多個單詞表示時,單詞與單詞之間必須采用連字符“_”連接。
如:#define CM_FILE_NOT_FOUND CMMAKEHR(0X20B) 其中CM表示類別。

(8)對const 的變量要求在變量的命名規則前加入c_。即:c_+變量命名規則;示例:const char* c_szFileName;

4、函數的命名規范

(1)函數的命名應該盡量用英文(或英文縮寫、中文全拼、中文全拼縮寫)表達出函數完成的功能——函數名應準確描述函數的功能。遵循動賓結構的命名法則,函數名中動詞在前,并在命名前加入函數的前綴,函數名的長度不得少于8個字母。函數名首字大寫,若包含有兩個單詞的每個單詞首字母大寫。如果是OOP 方法,可以只有動詞(名詞是對象本身)。示例:
LONG GetDeviceCount(……);
void print_record( unsigned int rec_ind ) ;
int input_record( void ) ;
unsigned char get_current_color( void ) ;

(2)避免使用無意義或含義不清的動詞為函數命名。如使用process、handle等為函數命名,因為這些動詞并沒有說明要具體做什么。

(3)必須使用函數原型聲明。函數原型聲明包括:引用外來函數及內部函數,外部引用必須在右側注明函數來源: 模塊名及文件名;內部函數,只要注釋其定義文件名——和調用者在同一文件中(簡單程序)時不需要注釋。
應確保每個函數聲明中的參數的名稱、類型和定義中的名稱、類型一致。

5、函數參數命名規范

(1)參數名稱的命名參照變量命名規范。
(2)為了提高程序的運行效率,減少參數占用的堆棧,傳遞大結構的參數,一律采用指針或引用方式傳遞。
(3)為了便于其他程序員識別某個指針參數是入口參數還是出口參數,同時便于編譯器檢查錯誤,應該在入口參數前加入const標志。
如:……cmCopyString(const CHAR * c_szSource, CHAR * szDest)

6、文件名(包括動態庫、組件、控件、工程文件等)的命名規范

文件名的命名要求表達出文件的內容,要求文件名的長度不得少于5個字母,嚴禁使用象file1,myfile之類的文件名。

1.2.文件命名

文件名后綴:

# C語言不糾結
file.h & file.c
# C++ Group.1(注意C是大寫)
file.h & file.C
# C++ Group.2
file.hh & file.cc
# C++ Group.3
file.hpp & file.cpp
# C++ Group.4
file.hxx & file.cxx

tip.1:c語言沒有選擇,以下僅討論c++;
tip.2:各組合可以混搭,比如常見的file.cpp搭配file.h和Google風格的file.cc搭配file.h;
tip.3:強迫癥可以選擇不混搭的各組,這樣看起來有對稱感;
tip.4:不要選擇第1組大寫C的后綴,特別是在Windows這樣不區分大小寫的操作系統上;
tip.5:一些后綴名可能不被某些較老的編譯器或IDE所默認支持,例如vs2005默認沒有擴展.hh后綴;
tip.6:如果需要跨平臺,推薦選擇第3組,至少boost是這么選的;

文件名命名:

# Teddy項目UserLog文件為例:
# Group.1
UserLog.c & TedUserLog.c
# Group.2
userlog.c & teduserlog.c
# Group.3
userlog.c & ted_userlog.c
# Group.4
user_log.c & ted_user_log.c
# Group.5
user-log.c & ted-user-log.c

tip.1:如果需要將源碼直接發布,可以使用項目名做前綴,防止鏈接時文件名沖突(msvc好像能自動重命名沖突的.obj文件,但是跨平臺程序不能依賴這個特性);
tip.2:各組文件名風格都沒有明顯的缺點,但要注意在區分大小寫的系統上UserLog.c和userlog.c是兩個文件;

1.3.類型命名

/*
** 基本數據類型的重定義,小寫比首字母大寫更有利于延長Shift壽命,
** 但也更容易產生命名沖突。
*/
typedef unsigned char byte;
typedef unsigned char byte_t;
typedef unsigned char Byte;
typedef unsigned char Byte_t;

/*
** 類與結構體常見的風格是采用PascalCase,不推薦使用camelCase
** 這種怪異的風格。
*/
class HashTable { ...
class hash_table { ...
struct FileInfo { ...
struct file_info { ...

/* C語言常見到的風格還有結構體名稱加'_t'后綴 */
struct fileinfo_t { ...
struct FileInfo_t { ...

/* 枚舉命名常見PascalCase風格 */
enum FileFlags { ...
enum file_flags { ...

tip.1:c語言沒有命名空間,為防止命名沖突,常見做法是將項目名或其縮寫作為類型名稱前綴;
tip.2:類,結構體,枚舉的命名風格盡量保持一致;

1.4.命名空間命名

/* 一般使用項目名稱,風格看喜好。 */
namespace my_project { ...
namespace MyProject { ...

tip.1:確保命名空間不會和常用的庫沖突;

1.5.函數和變量命名

/*
** 在函數和變量命名風格上PascalCase,camelCase,
** snake_case三足鼎立,選擇憑喜好。
*/
void FunctionName(void) { ...
void functionName(void) { ...
void function_name(void) { ...

long VarName;
long varName;
long var_name;

/*
** tip.1:snake_case在名稱比較長時可讀性較好;
*/
long variable_names_in_snake_case;
long VariableNamesInPascalCase;
long variableNamesInCamelCase;

/*
** tip.2:PascalCase和camelCase在函數中的區分度較好,
** 在快速掃描代碼邏輯的時候不易被其它符號所干擾。
*/
long FabonacciFunction(long rabbitNums)
{
 if (rabbitNums < 2) {
 return rabbitNums;
 }
 long resultOne = FabonacciFunction(rabbitNums - 1);
 long resultTwo = FabonacciFunction(rabbitNums - 2);
 return resultOne + resultTwo;
}

long fabonacci_function(long rabbit_nums)
{
 if (rabbit_nums < 2) {
 return rabbit_nums;
 }
 long result_one = fabonacci_function(rabbit_nums - 1);
 long result_two = fabonacci_function(rabbit_nums - 2);
 return result_one + result_two;
}

tip.3:如果類需要兼容標準庫迭代器或是要支持range for,begin()和end()函數會破壞PascalCase風格的一致性;

1.6.類成員變量和全局變量命名

/*
** 類成員變量和全局變量的命名風格和局部變量的命名風格
** 并沒有更多的區別。唯一的問題是,是否要加前綴或后綴
** 以方便和局部變量區分開來。
*/
class UserInfo {
 ...
private:
 std::string user_name_; /* Google style */
 std::string m_userName; /* Hungarian notation */
 /* 不推薦前綴'_'的風格,可能會和標準庫命名沖突 */
};

/* 全局變量要少用,推薦加前綴用于區分 */
extern "C" long g_commonCount;

tip.1:在有IDE提示時,前綴"m_"的類成員變量能夠很快被找到,如果不喜歡這種風格,"this->"同樣也很便利;

1.7.常量和枚舉值命名

/*
** 常量和枚舉值的命名風格建議和局部變量的命名風格區分開,
** 常見的有全字母大寫加'_'的風格,PascalCase風格,以及
** Google加'k'前綴的風格。
*/
static const int DAYS_IN_WEEK = 7;
static const int kDaysInWeek = 7;

enum FileOpenMode {
 ReadOnly, WriteOnly, ReadWrite
};

enum FileOpenMode {
 READ_ONLY, WRITE_ONLY, READ_WRITE
};

tip.1:如果可以使用c++11特性,推薦enum class,否則可以在有歧義的枚舉值中重復枚舉類型的名字;

1.8.宏命名

/* 宏命名推薦使用全字母大寫加'_'分隔的風格 */
#define OS_UNIX
#define OS_LINUX
#define OS_WINNT

/* 除非你想用條件編譯將某些功能變為可選項 */
#ifdef USE_TCMALLOC
#define my_malloc tcmalloc
#else
#define my_malloc malloc
#endif

tip.1:能用常量替代宏的地方盡量使用常量吧;

“C語言和C++的命名規范以及常見命名法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丰原市| 定陶县| 绥阳县| 江油市| 湛江市| 廊坊市| 榆林市| 伊金霍洛旗| 丹寨县| 丰县| 潞西市| 江山市| 怀集县| 兴安盟| 江西省| 青州市| 永德县| 水城县| 萨嘎县| 南皮县| 合阳县| 西充县| 腾冲县| 兴宁市| 常山县| 松阳县| 元氏县| 吉隆县| 南部县| 西华县| 准格尔旗| 天祝| 兴业县| 信阳市| 成安县| 咸丰县| 白城市| 乌苏市| 长宁区| 灌阳县| 永州市|