什么是'标识符'是C++中的'名字'?

cpx*_*cpx 9 c c++ naming-conventions

何时在C++中称为"名称"的"标识符"?我主要读到"名称"一词过于使用而不是"标识符",例如:

struct S { int i };
S thing1;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,是thing1一个名称IDENTIFER?或者术语"标识符"和"名称"是类似的吗?在C中,在引用对象时是否使用术语"名称"?

Joh*_*itb 15

在C++中,术语标识符只是一个数字,字母序列_,而不是以数字开头.这样的标识符可以出现在任何地方,并且不必标识任何内容,尽管它的名称(没有双关语).

术语名称将含义与某个语法结构相关联.C++的规范说以下语法的一个构造是一个名字,如果它是指一个实体(一个对象,一个,一个模板等)或一个标签(在这里你可以跳转到同goto)

  • 识别码
  • 模板id(identifier <...>,operator-function-id <...>并且literal-operator-id <...>,如foo <int>).
  • conversion-function-id(operator type如同operator int)
  • operator-function-id(operator @,如operator +)
  • literal-operator-id(operator "" identifieroperator "" _foo)

对于这些构造中的每一个,当名称与另一个名称相同时,规则的定义不同:对于标识符,两个名称相同的序列是相同的(这只是一个词法比较).对于表单conversion-function-id的名称,如果使用的类型是相同类型,则它们是相同的(因此这是语义比较).

正如您在literal-operator-id的示例中所看到的,非终端标识符可以出现在语法中不是名称的地方.因此,并非每个标识符都是名称,并非每个名称都是标识符.在template-id的示例中,我们使用名称的嵌套使用.之前的构造<...>分别是名称,因为它们表示声明的模板.