命名空间中是否有查找顺序,即标记命名空间和普通名称空间?请考虑以下代码:
#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
编译器首先查找要在标记名称空间中打印的变量。我不知道在普通命名空间中是否对同一个标识符进行了查找,如果完成了,我就无法解释它为什么不打印它。
答案 0 :(得分:7)
C中没有命名空间查找顺序。任何特定标识符都只考虑一个命名空间;它取决于查找的标识符类型。结构标签是一种,具有自己的命名空间;变量名称属于&#34;普通标识符&#34;的更广泛类别,它们具有单独的命名空间。还有其他名称空间,但编译器总是可以从上下文告诉哪一个与任何给定的标识符相关。
因此,在您的程序中,myst.min
的两个用法都引用声明为st myst;
的变量,并且&#34;标记中没有任何第二个变量&#34;命名空间(正如你似乎认为的那样)。
您可以通过评论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
(struct tag)确实在两个不同的名称空间中,并且可以独立引用。
(感谢John Bollinger的新第一段。-ed)
答案 1 :(得分:3)
C命名空间完全不相交。每个标识符都在一个名称空间中搜索。例如:
struct
和union
个关键字的标识符
goto
关键字的标识符
.
或->
符号后面的标识符在其结构或联合成员命名空间中搜索(每个结构和联合都有自己的成员命名空间;前面的表达式的类型决定了要搜索的那个)< / LI>
没有查找订单。要搜索的(唯一)命名空间完全由上下文决定。