C++ 保留一组 92 个单词(从 C++23 开始)供自己使用,这些单词被称为关键字(或保留字),每个关键字在 C++ 语言中都有特殊含义。
关键字
以下是所有 C++ 关键字的列表(到 C++23):
关键字列表1
- alignas
- alignof
- and
- and_eq
- asm
- auto
- bitand
- bitor
- bool
- break
- case
- catch
- char
- char8_t (since C++20)
- char16_t
- char32_t
- class
- compl
- concept (since C++20)
- const
- consteval (since C++20)
- constexpr
- constinit (since C++20)
关键字列表2
- const_cast
- continue
- co_await (since C++20)
- co_return (since C++20)
- co_yield (since C++20)
- decltype
- default
- delete
- do
- double
- dynamic_cast
- else
- enum
- explicit
- export
- extern
- false
- float
- for
- friend
- goto
- if
- inline
关键字列表3
- int
- long
- mutable
- namespace
- new
- noexcept
- not
- not_eq
- nullptr
- operator
- or
- or_eq
- private
- protected
- public
- register
- reinterpret_cast
- requires (since C++20)
- return
- short
- signed
- sizeof
- static
关键字列表4
- static_assert
- static_cast
- struct
- switch
- template
- this
- thread_local
- throw
- true
- try
- typedef
- typeid
- typename
- union
- unsigned
- using
- virtual
- void
- volatile
- wchar_t
- while
- xor
- xor_eq
标记为(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(); // 不常规写法(应以小写字母开头)
在本教程中,我们通常使用交替的大写字母方法,因为这样更易于阅读(在密集的代码块中,很容易将下划线误认为是空格)。但通常可以看到两种方式都有出现 — C++标准库使用下划线方法来命名变量和函数。有时您会看到两种方式混合使用:变量使用下划线,函数使用交替的大写字母。
值得注意的是,如果您在其他人的代码中工作,通常更好的做法是与您正在使用的代码的样式匹配,而不是严格遵循上面列出的命名约定。主要目标是保持代码的一致性和可读性。
在现有程序中工作时,请使用该程序的约定(即使它们不符合现代最佳实践)。编写新程序时使用现代最佳实践。
其次,您应该避免命名以下划线开头的标识符,因为这些名称通常保留给操作系统、库和/或编译器使用。
第三,您的标识符应该明确它们所持有的值的含义(特别是在单位不明显的情况下)。标识符的命名方式应该能够帮助那些不知道代码用途的人能够尽快弄清楚。三个月后,当你再次查看你的程序时,你会忘记它是如何工作的,并且你会感谢自己选择了有意义的变量名称。
然而,给一个微不足道的变量一个过于复杂的名称会阻碍对程序正在做什么的整体理解,几乎就像给一个广泛使用的标识符一个不适当的名称一样。因此,一个好的经验法则是使标识符的长度与其使用范围成正比。普通用途的标识符可以有一个短名称(例如i)。更广泛使用的标识符(例如,从程序中的许多不同位置调用的函数)应该具有更长且更具描述性的名称(例如,尝试使用openFileOnDisk代替open)。
变量名 | 好坏评价 | 评价原因 |
---|---|---|
int ccount | 不好 | “ccount”前的“c”代表什么? |
int customerCount | 好 | 清晰表示我们正在计数的是什么 |
int i | 可以 | 如果使用非常简单,则可以,否则不好 |
int index | 可以 | 如果明显知道我们正在索引的是什么,则可以 |
int totalScore | 可以 | 如果只计分一种东西,否则太模糊 |
int _count | 不好 | 不要以下划线开头的名称 |
int count | 可以 | 如果明显知道我们正在计数的是什么,则可以 |
int data | 不好 | 什么类型的数据? |
int time | 不好 | 这是以秒、分钟还是小时为单位? |
int minutesElapsed | 好 | 描述性的 |
int value1, value2 | 可以 | 在两者之间区分可能有点困难 |
int numApples | 好 | 描述性的 |
int monstersKilled | 好 | 描述性的 |
int x, y | 可以 | 如果使用非常简单,则可以,否则不好 |
无论如何,避免使用缩写(除非它们很常见/明确)。尽管它们减少了编写代码所需的时间,但它们使代码更难阅读。阅读代码的次数比编写代码的次数多,您在编写代码时节省的时间是每个读者(包括未来的您)在阅读代码时浪费的时间。如果您希望更快地编写代码,请使用编辑器的自动完成功能。
对于变量声明,使用注释来描述变量的用途或解释任何其他可能不明显的内容很有用。例如,假设我们声明了一个名为 的变量numberOfChars
,该变量应该存储一段文本中的字符数。文字是“Hello World!”吗?有 10、11 或 12 个字符?这取决于我们是否包含空格或标点符号。与其将变量命名为numberOfCharsIncludingWhitespaceAndPunctuation,这样的命名过于冗长,不如在声明行上方或上方放置一个合适的注释来帮助用户弄清楚:
// a count of the number of chars in a piece of text, including whitespace and punctuation
int numberOfChars;
这样的注释可以提供关于变量用途的重要上下文,使代码更易于理解。
原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/cpp-keywords-and-naming-identifiers/