首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中名称空间查找顺序

C中名称空间查找顺序
EN

Stack Overflow用户
提问于 2017-09-20 19:40:14
回答 2查看 103关注 0票数 2

名称空间中是否有查找顺序,即标记名称空间和普通名称空间?考虑以下代码:

代码语言:javascript
复制
#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

我猜,编译器首先要在标记命名空间中查找要打印的变量。我不知道查找是否在普通命名空间中完成相同的标识符,如果完成了,我就不知道为什么它不打印它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-20 19:54:16

C中没有名称空间查找顺序。对于任何特定标识符,只考虑一个名称空间;它取决于正在查找的标识符类型。结构标签是一种,有自己的名称空间;变量名属于更广泛的“普通标识符”类别,它有一个单独的名称空间。还有其他名称空间,但编译器总是可以从上下文中判断哪个名称空间与任何给定的标识符相关。

因此,在您的程序中,myst.min的两种用法都引用声明为st myst;的变量,并且在“标记”命名空间中没有任何第二个变量(正如您所认为的那样)。

您可以通过注释掉main上的myst.min = 7中的所有内容来查看这一点。

代码语言:javascript
复制
#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;
}

试图编译它将产生一个严重错误:

代码语言:javascript
复制
test.c: In function ‘main’:
test.c:14:3: error: ‘myst’ undeclared (first use in this function)

struct myst声明所做的是声明另一个类型的,然后您可以使用它来声明变量。但除非你真的这么做否则它不会被用来做任何事情。例如

代码语言:javascript
复制
#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)

票数 7
EN

Stack Overflow用户

发布于 2017-09-20 21:14:50

C名称空间是完全不相交的。每个标识符在一个名称空间中进行搜索。例如:

  • 在标记命名空间中搜索structunion关键字后面的标识符。
  • 在标签命名空间中搜索goto关键字后面的标识符。
  • 在结构或联合成员名称空间中搜索跟随.->符号的标识符(每个结构和联合都有自己的成员名称空间;前面表达式的类型决定要搜索哪一个)
  • 在普通命名空间中搜索其他标识符。

没有查找顺序。要搜索的(唯一)命名空间完全由上下文决定。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46330526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档