C++关键字和标识符命名规则

C++为自身使用保留了一组92个词(截至C++23)。这些词被称为关键字(或保留字),每个关键字在C++语言中都有特殊的含义。 以下是所有C++关键字的列表(截至C++23):

C++ 保留了一组 ​92 个关键字​(截至 C++23),这些关键字称为保留字,每个关键字在 C++ 语言中都有特殊含义。以下是 C++ 关键字的完整列表(截至 C++23):

关键字说明
alignas对齐说明符
alignof获取对齐要求
and逻辑与运算符(&& 的替代写法)
and_eq按位与赋值运算符(&= 的替代写法)
asm内联汇编语句
auto自动类型推导
bitand按位与运算符(& 的替代写法)
bitor按位或运算符(| 的替代写法)
bool布尔类型
break跳出循环或 switch 语句
caseswitch 语句的分支标签
catch异常捕获块
char字符类型
char8_t (C++20)UTF-8 字符类型
char16_tUTF-16 字符类型
char32_tUTF-32 字符类型
class类定义
compl按位取反运算符(~ 的替代写法)
concept (C++20)概念(用于模板约束)
const常量修饰符
consteval (C++20)立即函数(编译时求值)
constexpr常量表达式
constinit (C++20)常量初始化
const_cast常量类型转换
continue继续循环的下一次迭代
co_await (C++20)协程等待操作
co_return (C++20)协程返回操作
co_yield (C++20)协程生成操作
decltype推导表达式类型
default默认行为(switch/析构函数等)
delete删除动态内存或函数
dodo-while 循环
double双精度浮点类型
dynamic_cast动态类型转换
elseif 语句的否定分支
enum枚举类型
explicit禁止隐式转换
export模板导出(已弃用)
extern外部链接声明
false布尔假值
float单精度浮点类型
forfor 循环
friend友元声明
goto跳转语句
if条件语句
inline内联函数或变量
int整型
long长整型
mutable允许修改 const 成员变量
namespace命名空间
new动态内存分配
noexcept声明函数不抛出异常
not逻辑非运算符(! 的替代写法)
not_eq不等运算符(!= 的替代写法)
nullptr空指针字面量
operator运算符重载
or逻辑或运算符(|| 的替代写法)
or_eq按位或赋值运算符(|= 的替代写法)
private类私有成员
protected类保护成员
public类公有成员
register建议编译器将变量放入寄存器(已弃用)
reinterpret_cast重新解释类型转换
requires (C++20)模板约束
return函数返回值
short短整型
signed有符号整数修饰符
sizeof获取类型或对象大小
static静态存储期或成员
static_assert编译时断言
static_cast静态类型转换
struct结构体定义
switch多分支选择语句
template模板定义
this当前对象的指针
thread_local线程局部存储
throw抛出异常
true布尔真值
try异常捕获块
typedef类型别名(建议使用 using 替代)
typeid获取类型信息
typename模板类型参数声明
union联合体定义
unsigned无符号整数修饰符
using类型别名或命名空间引入
virtual虚函数声明
void无类型
volatile易变性修饰符
wchar_t宽字符类型
whilewhile 循环
xor按位异或运算符(^ 的替代写法)
xor_eq按位异或赋值运算符(^= 的替代写法)

注意:标记为 (C++20) 的关键字是在 C++20 中新增的。若编译器不支持 C++20,这些关键字可能无法使用。

关键字使用注意事项

标记为(C++20)的关键字是在C++20中添加的。如果您的编译器不是C++20兼容的(或者具有C++20功能,但默认情况下是关闭的),这些关键字可能无法正常工作。 C++还定义了特殊标识符:override、final、import和module。这些在某些上下文中使用时具有特定的含义,但通常情况下并不保留。 您已经遇到了一些关键字,包括int和return。除了一组操作符,这些关键字和特殊标识符定义了整个C++语言(不包括预处理器命令)。由于关键字和特殊标识符具有特殊的含义,您的IDE可能会改变这些词的文本颜色,使它们从其他标识符中脱颖而出。

完成本教程系列后,您将了解这些词的几乎所有用途!

标识符命名规则

作为提醒,变量(或函数、类型或其他类型的项)的名称称为标识符。C++为您提供了很大的灵活性来命名标识符。然而,在命名标识符时必须遵循一些规则:

  • 标识符不能是关键字。关键字是保留的。
  • 标识符只能由字母(小写或大写)、数字和下划线字符组成。这意味着名称不能包含符号(除了下划线)或空白(空格或制表符)。
  • 标识符必须以字母(小写或大写)或下划线开头。它不能以数字开头。
  • C++是区分大小写的,因此区分小写和大写字母。nvalue与nValue与NVALUE是不同的。

标识符命名最佳实践

现在您知道如何命名变量,让我们讨论应该如何命名变量(或函数)。

变量命名约定

按照C++的惯例,变量名应该以小写字母开头。如果变量名是一个单词或缩写,整个名称应该用小写字母书写。

int value; // 传统

int Value; // 非传统(应该以小写字母开头)
int VALUE; // 非传统(应该以小写字母开头并且全部小写)
int VaLuE; // 非传统(去看你的精神病医生);)

函数命名约定

大多数情况下,函数名也以小写字母开头(尽管在这方面有一些分歧)。我们将遵循这一惯例,因为所有程序都必须有的函数main(以及C++标准库中的所有函数)都是以小写字母开头的。

以大写字母开头的标识符名称通常用于用户定义的类型(例如结构体、类和枚举,我们将在后面介绍)。

多词标识符命名

如果变量或函数名称是多词的,有两种常见的约定:用下划线分隔的单词(有时称为snake_case),或者首字母大写(有时称为camelCase,因为大写字母像骆驼背上的驼峰一样突出)。

int my_variable_name;   // 传统(用下划线分隔/snake_case)
int my_function_name(); // 传统(用下划线分隔/snake_case)

int myVariableName;     // 传统(首字母大写/camelCase)
int myFunctionName();   // 传统(首字母大写/camelCase)

int my variable name;   // 无效(不允许有空格)
int my function name(); // 无效(不允许有空格) 

int MyVariableName;     // 非传统(应该以小写字母开头)
int MyFunctionName();   // 非传统(应该以小写字母开头)

在本教程中,我们通常使用首字母大写的命名方式,因为它更容易阅读(在密集的代码块中很容易将下划线误认为空格)。但也经常看到两者的混合:变量使用下划线方法,函数使用首字母大写。值得注意的是,如果您正在别人的代码中工作,通常认为最好匹配您正在工作的代码的风格,而不是严格遵循上述命名约定。

命名最佳实践

最佳实践:

  • 在现有程序中工作时,使用该程序的约定(即使它们不符合现代最佳实践)。在编写新程序时使用现代最佳实践。
  • 避免以下划线开头命名您的标识符。尽管在语法上是合法的,但这些名称通常保留给操作系统、库和/或编译器使用。
  • 您的标识符名称应该清楚地表明它们持有的值的含义(特别是如果单位不明显)。标识符应该以一种方式命名,以帮助一个对您的代码一无所知的人尽快弄清楚。三个月后,当您再次查看您的程序时,您会忘记它是如何工作的,您会感谢自己选择了有意义的变量名。

然而,给一个微不足道的标识符一个过于复杂的名字,几乎和给一个非平凡的标识符一个不充分的名字一样,会妨碍对程序整体的理解。一个好的经验法则是使标识符的长度与其特定性和可访问性成比例。这意味着:

  • 一个只存在于几个语句中的标识符(例如,在短函数的主体中)可以有一个更短的名称。
  • 一个可以从任何地方访问的标识符可能受益于一个更长的名称。
  • 代表一个非特定数字的标识符(例如,用户提供的任何东西)可以有一个更短的名称。
  • 代表一个特定值的标识符(例如,以毫米为单位的内缝长度)应该有一个更长的名称。

变量命名示例

变量名评价说明
int ccount不好“count"前的"c"代表什么?
int customerCount清楚我们在计数什么
int i两者都可以如果使用是微不足道的,可以,否则不好
int index两者都可以如果明显我们在索引什么,可以
int totalScore两者都可以如果有且只有一个东西被评分,可以,否则太模糊
int _count不好不要以下划线开头命名
int count两者都可以如果明显我们在计数什么,可以
int data不好这是什么类型的数据?
int time不好这是几秒、几分钟还是几小时?
int minutesElapsed两者都可以如果明显这是从什么时候开始的,可以
int x1, x2两者都可以如果使用是微不足道的,可以,否则不好
int userinput1, userinput2不好由于名字太长,很难区分这两个
int numApples描述性
int monstersKilled描述性

关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"