C

时间:2017-09-20 19:40:14

标签: c namespaces name-lookup

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

#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

编译器首先查找要在标记名称空间中打印的变量。我不知道在普通命名空间中是否对同一个标识符进行了查找,如果完成了,我就无法解释它为什么不打印它。

2 个答案:

答案 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命名空间完全不相交。每个标识符都在一个名称空间中搜索。例如:

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

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

相关问题