C&C++设计风格选择 命名规范
1.命名规范
1.1.常见命名法
然而,当面对复杂情况时就有些棘手,给全局变量取一个描述性的名字是必要的。把一个全局函数叫做“foo”是一种目光短浅的行为。全局函数也一样,如果你有一个统计当前用户个数的函数,应当把它命名为“count_active_user()”或者简单点些的类似名称,不应该命名为“cntusr()”。
printEmployeePaychecks();
print_employee_paychecks();
匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。
DisplayInfo();
string UserName;
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 );
即开头字母用变量的类型,其余部分用变量的英文意思、英文的缩写、中文全拼或中文全拼的缩写,要求单词的第一个字母应大写。
即: 变量名=变量类型+变量的英文意思(或英文缩写、中文全拼、中文全拼缩写)
对非通用的变量,在定义时加入注释说明,变量定义尽量可能放在函数的开始处。
见下表:
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
对一重指针变量的基本原则为:“p”+变量类型前缀+命名,如一个float*型应该表示为pfStat。对二重指针变量的基本规则为:“pp”+变量类型前缀+命名。对三重指针变量的基本规则为:“ppp”+变量类型前缀+命名。
enum cmEMDAYS
{
EMDAYS_MONDAY;
EMDAYS_TUESDAY;
……
};
struct ScmNPoint
{
int nX;//点的X位置
int nY; //点的Y位置
};
union UcmLPoint
{
LONG lX;
LONG lY;
}
如:#define CM_FILE_NOT_FOUND CMMAKEHR(0X20B) 其中CM表示类别。
LONG GetDeviceCount(……);
void print_record( unsigned int rec_ind ) ;
int input_record( void ) ;
unsigned char get_current_color( void ) ;
应确保每个函数声明中的参数的名称、类型和定义中的名称、类型一致。
(2)为了提高程序的运行效率,减少参数占用的堆栈,传递大结构的参数,一律采用指针或引用方式传递。
(3)为了便于其他程序员识别某个指针参数是入口参数还是出口参数,同时便于编译器检查错误,应该在入口参数前加入const标志。
如:……cmCopyString(const CHAR * c_szSource, CHAR * szDest)
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.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.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++实现五子棋AI算法思想
栏 目:C语言
下一篇:总结c++性能优化策略
本文标题:C&C++设计风格选择 命名规范
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/844.html
您可能感兴趣的文章
- 04-02c语言没有round函数 round c语言
- 01-10数据结构课程设计- 解析最少换车次数的问题详解
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10深入理解C++中常见的关键字含义
- 01-10C语言 解决不用+、-、&#215;、&#247;数字运算符做加法
- 01-10使用C++实现全排列算法的方法详解
- 01-10c++中inline的用法分析
- 01-10用C++实现DBSCAN聚类算法
- 01-10全排列算法的非递归实现与递归实现的方法(C++)
- 01-10C++大数模板(推荐)
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10SublimeText编译C开发环境设置
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11ajax实现页面的局部加载
- 01-10C#中split用法实例总结
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 04-02jquery与jsp,用jquery