【发布时间】:2015-01-28 12:51:54
【问题描述】:
在 C 中,大部分声明结构的代码都遵循这种模式:
/* struct forward-declaration */
typedef struct T T ;
/* struct definition */
typedef struct T
{
/* etc. */
} T ;
这种情况非常普遍,与我交谈过的大多数开发人员甚至都不知道上面的代码同时做了两件事(结构声明,然后在正常命名空间中为结构名称起别名),只是出于习惯而编写它。
在 C++ 中,该问题已得到缓解,因此您可以省略类型定义部分。在 C# 和 Java 中,设计者甚至都懒得理会。所以这些语言无助于理解为什么 C 会这样做。
所以,经过Oliver Charlesworth的建议:
将struct T 置于与其他普通标识符不同的命名空间中是否存在技术原因?
编辑
C89/C90标准中的相关部分是:
6.1.2.3 标识符的命名空间
在翻译单元的任何位置都可以看到多个特定标识符的声明。句法上下文消除了引用不同实体的用法的歧义。因此。不同类别的标识符有单独的命名空间,如下:
[...]
结构、联合和枚举的标签(通过使用关键字struct、union或enum)。
[...]
所有其他标识符。称为普通标识符(在普通声明符中声明或作为枚举常量声明)。
C11(n1570:6.2.3 标准草案)的文本大致相同。
【问题讨论】:
-
这不是针对 typedef 而不是针对结构吗? IOW,
typedef有什么变化? -
不是 100% 清楚你在这里问什么;是“为什么
struct T在与T不同的命名空间中”? -
Hysterical reasons。基本上,编译器很小而且不是很聪明。
-
回到very早期的C,甚至回到全局命名空间中的struct members。也许他们有点过头了。
标签: c namespaces