实体和标识符之间有什么区别?

时间:2012-11-24 16:05:16

标签: c c99

来自C99标准:

6.2.1 / 2

  

对于标识符指定的每个不同实体,   标识符仅在区域内可见(即,可以使用)   程序文本称为其范围。由指定的不同实体   相同的标识符具有不同的范围,或者具有不同的名称   空格。

我对实体和标识符感到困惑(我知道它可以是对象的名称)。根据这个引用的例子,实体究竟是什么?

4 个答案:

答案 0 :(得分:3)

实体是变量,函数,类型等。标识符是这些实体的名称。例如:

#include <stdlib.h>
#include <stdio.h>

static int foo()
{
    static int x = 0; // "x" is an identifier, the variable "x" inside
                      // this function "foo()" is an entity.
    return x++;
}

int main()
{
    int x = 1; // "x" is an identifier as well, and it is the same name "x"
                   // as of that used inside "foo()". However, this entity
                   // (variable) is not the same as in "foo()", it has different
               // scope and is a totally different entity.
    printf("foo()+x++ = %d\n", foo()+x++);
    printf("foo()+x++ = %d\n", foo()+x++);
    printf("foo()+x++ = %d\n", foo()+x++);
    return EXIT_SUCCESS;
}

答案 1 :(得分:1)

实体是变量,我的意思是它意味着包含数据的一些内存(或寄存器),或类型,枚举等编译对象,它们具有大小,组件字段等属性。标识符只是一个名称对于某个实体。

两个不同的实体可以具有相同的名称(取决于范围),但在程序的任何位置,名称只匹配一个实体。

答案 2 :(得分:1)

考虑以下C程序

#include<stdio.h>

int main(void)
{

 int var1, var2;
 .....
 .....


}

int newfun(void)
{
 int var1;
 float var2;
 ....
 ....

}

因此,对于每个不同的实体(可以认为是变量),可以在程序文本的区域内使用标识符(变量名,上面:var1,var2)。即,main()函数中定义的var1和var2只能在其中使用。

虽然,函数main()和newfun()中的标识符是相同的,即int var1和float var2。每种功能都对待它们。

现在,main()函数中的变量(或标识符)的类型为int。它们可以统称为实体。但是,下一个函数中的相同变量var2是float类型,它是不同类型的,因此是不同实体的类型。

答案 3 :(得分:1)

请注意,单个标识符可以同时指定不同的实体。

#include <stdio.h>

static int x = 42;             // 1

struct x { int x; };           // 2 & 3

int func(struct x x)           // 4
{
    if (x.x > 10) goto x;      // 5
    int y = x.x;
    {
    int x = 37;                // 6
    printf("%d %d\n", x, y);
    }
x:                             // 7
    return(x.x);
}

我认为我们可以同意x是一个彻底过度工作的标识符。

  1. x是文件范围内int类型的静态变量。
  2. x是结构标记。
  3. x是结构成员。
  4. xstruct x类型的参数/局部变量(隐藏文件范围变量)。
  5. x是对标签的引用。
  6. x是一个新的局部变量(隐藏文件范围变量和参数)。
  7. x是标签的定义。
  8.   

    对于标识符指定的每个不同实体,标识符仅在称为其范围的程序文本的区域内可见(即,可以使用)。由相同标识符指定的不同实体具有不同的范围,或者位于不同的名称空间中。

    结构标记x在首次引用到文件末尾的位置是可见的。它位于标记命名空间中,因此不会与x的其他用法冲突。标签x位于标签名称空间中,因此不会与x的其他用途冲突。结构成员x位于“struct x”命名空间的成员中,与x的其他用法不冲突。这是三个特殊名称空间。

    x的其他引用都在'普通标识符'命名空间中。 Typedef名称也在普通命名空间中;这就是我没有使用typedef的原因。名为x的三个不同变量具有不同的范围。

    我已经放弃了宏名称空间;如果我在开始时添加了#define x z,那么我要说的关于x的所有内容都必须在预处理之后说出z