标识符规则与命名规范

标识符规则与命名规范

一、标识符基本规则(语言强制要求)

组成规则:

允许字符:字母(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 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

concept Numerical = std::integral || std::floating_point;

// 概念名清晰表达约束

黄金原则总结:

可读性高于简洁性:宁可稍长也要清晰

项目风格统一优先:即使不符合个人习惯

避免神秘主义命名:他人无需上下文即可理解

类型信息内嵌命名:如 timeout_ms(毫秒)、buffer_size_bytes

编译器强制规则必须遵守,规范建议尽可能遵守

相关推荐