C&C++设计风格选择 命名规范

2020-01-06 18:26:46丽君

# 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风格的一致性;