我正在使用K.N.King的《C编程:现代方法》学习C语言.引用这本书,

每个 struct 代表一个新的作用域;在该作用域中声明的任何名称都不会与程序中的其他名称冲突.(在C术语中,我们说每个 struct 的成员都有单独的名称空间.)

我以前从来没有真正考虑过 struct 成员的标识符.但仔细想想,令人惊讶的是,使用与局部变量相同的标识符并不会隐藏其他标识符,尽管它应该隐藏其他标识符.

所以我看了一下C中的name space,并阅读了C99标准文档.在6.2.3节中,该标准声明了 struct 成员的名称空间,如下所示.

struct 或联盟的成员;每个 struct 或联盟都有单独的名称 用于其成员的空间(通过用于访问 成员通过.或-&>运算符);

真正让我困扰的是each structure or union has a separate name space for its members的含义.

我要求澄清C struct 和联合中成员的单独命名空间的概念.具体地说,每个 struct 或联合对其成员具有单独的名称空间的概念是否意味着(A)特定 struct 的每个变量都有自己的名称空间,或者(B)每个 struct (或联合)标记在定义时都有自己的名称空间?

例如,在创建像struct s var_a, var_b;这样的 struct 变量时,我想了解每个变量(var_avar_b)是否都有自己的名称空间.

推荐答案

每种 struct 类型都有自己的命名空间,而不是每个 struct 变量.

C中有四个categories的名称空间:标签、标记、成员和普通标识符.理论上有无限多的名称空间,因 for each struct 和联合类型都有自己的成员名称空间,并且对 struct 和联合类型的数量没有限制.

(历史trivia:C语言的前身没有单独的成员名称空间.所有 struct 的成员名称都共享一个名称空间,因此在 struct 布局中不能有具有相同名称成员的不同偏移量的 struct .)

C++相关问答推荐

C限制限定符是否可以通过指针传递?

为什么在传输 Big Data 时共享内存段的运行时间比管道更长?

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

丑陋的三重间接:可扩展的缓冲区管理 struct

两个连续的语句是否按顺序排列?

变量>;-1如何在C中准确求值?

为什么GDB/MI进程的FIFO循环中有read()阻塞

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

用C++从外部ELF符号读取值

如何使用C++在控制台中以彩色打印被阻止的客户端

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

用于计算位数和的递归C函数

赋值两侧的后置增量,字符指针

&stdbool.h&q;在嵌入式系统中的使用

C语言中的指针和多维数组

通过char*访问指针的对象表示是未定义的行为吗?

将不同类型的指针传递给函数(C)

x86-64平台上的int_fast8_t大小与int_fast16_t大小

如何转义包含指令中的字符?

将帧从相机 (/dev/video0) 复制到帧缓冲区 (/dev/fb0) 会产生意外结果