以文本方式查看主题 - 曙海教育集团论坛 (http://sun4.cn/bbs/index.asp) -- C++语言开发 (http://sun4.cn/bbs/list.asp?boardid=63) ---- C(不讨论C++)语言 (http://sun4.cn/bbs/dispbbs.asp?boardid=63&id=2426) |
-- 作者:wangxinxin -- 发布时间:2010-12-10 14:26:54 -- C(不讨论C++)语言 C语言中的名字空间, 较少被提及. 下面的写法乍看之下是会让人吃惊的: #include <stdio.h> struct Foo typedef struct Foo Foo; Foo 首先是一个struct的tag名字, 其次又被typedef定义了一个同名的别名. 然后, 在main函数中, 这样的程序竟然是符合标准的. 原因就在于C语言中有4个名字空间, 当标识符在不同的上下文情境下位于不同的名字空间时, 可同时出现而不会引起冲突. 我查看了C语言标准, 6.2.3 Name Spaces and Identifiers 3. struct, 或union 的成员, 位于由相应的struct或union 声明范围内的一个密闭名字空间, 两个不同的struct, 或struct与union 的成员, 可以有同样的名字, 这一规则可以递归地施行于struct / union 的子成员. 如果它们本身也是一个struct或union 的话. 4. 所有其它的一切东西, 比如函数名, 变量名等等. 根据这4条, 上面的程序该如何解释? Foo 重复出现了3次: 根据上面的定义, 作为typedef定义出来的类型名和main内的变量名同属于"其它"类, 应该会出现冲突. 但实际上这样的用法是允许的. 因为在main内通过 那一行注释起来的 test.c:15: error: expected \';\' before \'t1\' 因为在此时的上下文中, 就有了两个identifier位于同一个名字空间. 而printf中的sizeof(Foo) 究竟是作为typedef定义出来的别名Foo, 还是变量名Foo. 虽然无法从程序运行结果上知道, 但可以确定应该是变量名Foo, 简单的实验加推理可以证实这一点: 推理: int main() 另一个需要注意的地方是, C语言中定义的结构的可见性, 是平坦的, 熟悉C++类型系统的人可能会怀疑是否能直接使用结构Bar, 要不要Foo::, C里面Bar的可用性跟Foo是平级的.本篇文章 |