名称空间中是否有查找顺序,即标记名称空间和普通名称空间?考虑以下代码:
#include <stdio.h>
int main (void){
typedef struct{ //This belongs to ordinary name space
int min;
} st;
st myst;
myst.min=6;
struct myst{ // This belongs to tag name space
int min;
};
myst.min=7;
printf("%d\n%d\n",myst.min,myst.min);
return 0;
}输出
7 7
我猜,编译器首先要在标记命名空间中查找要打印的变量。我不知道查找是否在普通命名空间中完成相同的标识符,如果完成了,我就不知道为什么它不打印它。
发布于 2017-09-20 19:54:16
C中没有名称空间查找顺序。对于任何特定标识符,只考虑一个名称空间;它取决于正在查找的标识符类型。结构标签是一种,有自己的名称空间;变量名属于更广泛的“普通标识符”类别,它有一个单独的名称空间。还有其他名称空间,但编译器总是可以从上下文中判断哪个名称空间与任何给定的标识符相关。
因此,在您的程序中,myst.min的两种用法都引用声明为st myst;的变量,并且在“标记”命名空间中没有任何第二个变量(正如您所认为的那样)。
您可以通过注释掉main上的myst.min = 7中的所有内容来查看这一点。
#include <stdio.h>
int main (void){
#if 0
typedef struct{ //This belongs to ordinary name space
int min;
} st;
st myst;
myst.min=6;
#endif
struct myst{ // This belongs to tag name space
int min;
};
myst.min=7;
printf("%d\n%d\n",myst.min,myst.min);
return 0;
}试图编译它将产生一个严重错误:
test.c: In function ‘main’:
test.c:14:3: error: ‘myst’ undeclared (first use in this function)struct myst声明所做的是声明另一个类型的,然后您可以使用它来声明变量。但除非你真的这么做否则它不会被用来做任何事情。例如
#include <stdio.h>
typedef struct { int min; } st;
struct myst { int min };
int main(void)
{
// uses the typedef name 'st', in the ordinary namespace,
// to declare the variable 'myst', also in the ordinary namespace
st myst = { 6 };
// uses the struct name 'myst', in the tag namespace,
// to declare the variable 'myst2', in the ordinary namespace
struct myst myst2 = { 7 };
printf("%d %d\n", myst.min, myst2.min);
return 0;
}将打印6 7。这个程序还说明了变量myst和结构标记myst是如何在两个不同的名称空间中独立引用的。
(感谢约翰·博林格的新的第一段。-ed)
发布于 2017-09-20 21:14:50
C名称空间是完全不相交的。每个标识符在一个名称空间中进行搜索。例如:
struct和union关键字后面的标识符。goto关键字后面的标识符。.或->符号的标识符(每个结构和联合都有自己的成员名称空间;前面表达式的类型决定要搜索哪一个)没有查找顺序。要搜索的(唯一)命名空间完全由上下文决定。
https://stackoverflow.com/questions/46330526
复制相似问题