来自C99标准:
6.2.1 / 2
对于标识符指定的每个不同实体, 标识符仅在区域内可见(即,可以使用) 程序文本称为其范围。由指定的不同实体 相同的标识符具有不同的范围,或者具有不同的名称 空格。
我对实体和标识符感到困惑(我知道它可以是对象的名称)。根据这个引用的例子,实体究竟是什么?
答案 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
是一个彻底过度工作的标识符。
x
是文件范围内int
类型的静态变量。x
是结构标记。x
是结构成员。x
是struct x
类型的参数/局部变量(隐藏文件范围变量)。x
是对标签的引用。x
是一个新的局部变量(隐藏文件范围变量和参数)。x
是标签的定义。对于标识符指定的每个不同实体,标识符仅在称为其范围的程序文本的区域内可见(即,可以使用)。由相同标识符指定的不同实体具有不同的范围,或者位于不同的名称空间中。
结构标记x
在首次引用到文件末尾的位置是可见的。它位于标记命名空间中,因此不会与x
的其他用法冲突。标签x
位于标签名称空间中,因此不会与x
的其他用途冲突。结构成员x
位于“struct x
”命名空间的成员中,与x
的其他用法不冲突。这是三个特殊名称空间。
x
的其他引用都在'普通标识符'命名空间中。 Typedef名称也在普通命名空间中;这就是我没有使用typedef
的原因。名为x
的三个不同变量具有不同的范围。
我已经放弃了宏名称空间;如果我在开始时添加了#define x z
,那么我要说的关于x
的所有内容都必须在预处理之后说出z
。