什么是’标识符’是C ++中的’名字’?
何时在C ++中称为“名称”的“标识符”? 我主要读到“名称”一词过于使用而不是“标识符”,例如:
struct S { int i }; S thing1;
在这种情况下, thing1
是名称还是标识符 ? 或者术语“标识符”和“名称”是类似的吗? 在C中,在引用对象时是否使用术语“名称”?
在C ++中,术语标识符只是一个数字,字母和_
的序列,而不是以数字开头。 这样的标识符可以出现在任何地方,并且不必标识任何内容,尽管它的名称(没有双关语)。
术语名称将含义与某个语法结构相关联。 C ++规范说如果下面的一个语法结构表示一个实体(一个对象 ,一个类 ,一个模板等)或一个标签(你可以用goto
跳转到),它就是一个名字。
- 识别码
- template-id (
identifier <...>
,operator-function-id <...>
和literal-operator-id <...>
,如foo
)。 - conversion-function-id (
operator type
,如operator int
) - operator-function-id (
operator @
,如operator +
) - literal-operator-id (
operator "" identifier
,如operator "" _foo
)
对于这些构造中的每一个,当名称与另一个名称相同时,规则的定义不同:对于标识符,两个名称相同的序列是相同的(这只是一个词法比较)。 对于表单conversion-function-id的名称,如果使用的类型是相同类型,则它们是相同的(因此这是语义比较)。
正如您在literal-operator-id的示例中所看到的,非终端标识符可以出现在语法中不是名称的地方。 因此,并非每个标识符都是名称,并非每个名称都是标识符 。 在template-id的示例中,我们使用名称的嵌套使用。 <...>
之前的构造分别是名称,因为它们表示声明的模板。