一、标识符基本规则(语言强制要求)
组成规则:
允许字符:字母(a-z, A-Z)、数字(0-9)、下划线(_)
首字符限制:不能以数字开头
大小写敏感:myVar 和 myvar 是不同的标识符
长度限制:理论上无限制(但编译器通常有实际限制)
禁止关键字:
int class = 5; // 错误!class是关键字
double return = 1.0; // 错误!return是关键字
特殊保留名:
避免使用双下划线开头:__reserved(编译器保留)
避免单下划线加大写字母:_Reserved(系统保留)
避免用下划线开头全局变量:_count(可能冲突)
二、主流命名规范(最佳实践)
通用原则
清晰表达意图:employeeCount ✓ vs ecnt ✗
保持一致性:项目内统一风格
避免缩写歧义:buf (buffer) 可接受,bff (?) 不可接受
拒绝拼音混合:shuju_count(数据)✗
常用风格规范表
类别
推荐风格
示例
适用场景
变量/函数
snake_case
user_count
推荐通用
camelCase
itemPrice
Qt/MFC项目
类/结构体
PascalCase
StringParser
面向对象
常量
UPPER_CASE
MAX_SIZE
全局常量
成员变量
尾部下划线
count_
区分局部变量
私有成员
m_前缀
m_isValid
某些框架
宏定义
全大写+下划线
LOG_ERROR()
仅宏使用
三、分项命名规范详解
1. 变量命名
// 推荐
std::vector
int buffer_size = 1024; // 描述清楚
auto connection_count = 0; // 类型自动推导
// 避免
int n; // 无意义
int usrN; // 含糊缩写
2. 函数命名
// 动词开头,表达动作
void calculate_tax();
std::string get_user_name();
bool validate_input();
// 避免形容词命名
void good(); // ✗ 意义不明确
void fast(); // ✗ 主观概念
3. 类/结构体命名
class NetworkController { // 名词+业务含义
public:
void start_service();
private:
int connection_count_;
};
struct Point3D { // 简单数据集合
float x;
float y;
float z;
};
4. 枚举命名
// 传统枚举(容易污染命名空间)
enum Colors { RED, GREEN, BLUE };
int RED = 0; // 冲突!✗
// C++11 强类型枚举(推荐)
enum class FileStatus {
OPENED,
CLOSED,
ERROR
};
auto status = FileStatus::OPENED; // 安全访问
四、特殊场景规范
指针/引用标识:
// 明确指针类型
Document* active_document_ptr = nullptr;
// 标识引用
const Config& global_config_ref = get_config();
布尔变量特殊前缀:
bool is_valid = false;
bool has_buffer = true;
bool enable_logging = true;
项目结构一致性:
头文件:network_service.hpp
源文件:network_service.cpp
类定义:class NetworkService
成员函数:ServiceResult start()
五、跨平台注意事项
大小写敏感:
// Windows可能忽略大小写,Unix严格区分
openFile() ≠ openfile() // Unix平台会报错
文件名限制:
避免空格:My Project.cpp ✗
避免特殊字符:@#$% ✗
六、现代C++命名实践
auto类型推导命名:
// 保持描述性
auto employee_list = get_employees(); // ✓ 明显容器类型
auto ptr = func(); // ✗ 丢失类型信息
lambda表达式命名:
// 复杂lambda命名提高可读性
auto data_processor = [](const DataPacket& packet) {
// 处理逻辑...
};
概念约束命名:
template
concept Numerical = std::integral
// 概念名清晰表达约束
黄金原则总结:
可读性高于简洁性:宁可稍长也要清晰
项目风格统一优先:即使不符合个人习惯
避免神秘主义命名:他人无需上下文即可理解
类型信息内嵌命名:如 timeout_ms(毫秒)、buffer_size_bytes
编译器强制规则必须遵守,规范建议尽可能遵守