一、标识符基本规则(语言强制要求)
-
组成规则:
- 允许字符:字母(a-z, A-Z)、数字(0-9)、下划线(_)
- 首字符限制:不能以数字开头
- 大小写敏感:
myVar和myvar是不同的标识符 - 长度限制:理论上无限制(但编译器通常有实际限制)
-
禁止关键字:
int class = 5; // 错误!class是关键字 double return = 1.0; // 错误!return是关键字 -
特殊保留名:
- 避免使用双下划线开头:
__reserved(编译器保留) - 避免单下划线加大写字母:
_Reserved(系统保留) - 避免用下划线开头全局变量:
_count(可能冲突)
- 避免使用双下划线开头:
二、主流命名规范(最佳实践)
通用原则
- 清晰表达意图:
employeeCount✓ vsecnt✗ - 保持一致性:项目内统一风格
- 避免缩写歧义:
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<Student> student_list; // 容器类使用复数
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<typename T> concept Numerical = std::integral<T> || std::floating_point<T>; // 概念名清晰表达约束
黄金原则总结:
- 可读性高于简洁性:宁可稍长也要清晰
- 项目风格统一优先:即使不符合个人习惯
- 避免神秘主义命名:他人无需上下文即可理解
- 类型信息内嵌命名:如
timeout_ms(毫秒)、buffer_size_bytes- 编译器强制规则必须遵守,规范建议尽可能遵守
浙公网安备 33010602011771号