在C中,大多数声明结构的代码将遵循以下模式:
/* struct forward-declaration */
typedef struct T T ;
/* struct definition */
typedef struct T
{
/* etc. */
} T ;与我交谈的大多数开发人员甚至都不知道上面的代码同时做了两件事(struct声明,然后在普通的命名空间中混叠了结构名称),而且只是出于习惯而写的。
在C++中,问题得到了缓解,因此您可以省略打印部分。在C#和Java中,设计人员甚至都不费心。因此,这些语言无法帮助理解为什么C会这样做。
因此,在Oliver Charlesworth的建议之后:
是否有技术原因使struct T 与其他普通标识符分离?
编辑
C89/C90标准的相关部分是:
6.1.2.3标识符的名称空间 一个特定标识符的多个声明在翻译单元的任何一点上都是可见的。句法上下文消除了引用不同实体的用法的歧义。因此。不同类别的标识符有单独的名称空间,如下所示:
C11的文本(n 1570:6.2.3标准草案)大致相同。
发布于 2021-09-08 15:05:20
在将typedef添加到复杂的解析之前,对象声明总是以一个保留字开头:struct、int、char、float或double,可能是long或union (不确定这些词是在typedef之前还是之后添加的)。因为除了关键字struct之外,任何地方都不能显示结构标记,所以编译器没有理由关心结构标记是否与任何其他标识符共享名称。
需要将typedef名称与任何其他标识符的名称区分开来,这是由于语法上的歧义造成的,即允许在对象声明或强制转换表达式中使用自定义类型,而不使用任何保留的单词或标点符号(在函数开始时,x * y;可以创建一个名为x*类型的对象,也可以将x乘以y并丢弃该结果,(x)(y)可以将y转换为x类型,或者使用参数y调用函数)。
发布于 2014-11-30 11:55:08
只有当您希望使用第二个声明中的名称struct T引用T时,才需要第一行。
对于不包含此类引用的结构,只需要第二种形式。对于这种情况,为了简单和简洁,我建议删除当时毫无意义的struct标记:
typedef struct {
/* interesting fields go here */
} T;而且,typedef不“将结构名称带入正常的名称空间”,而是为不同类型的名称struct T创建别名(T) (就像typedef总是做的那样)。当然,这里的名称拼写之间没有联系,这就是为什么我建议首先删除标记struct的原因,它只是添加了一个大多数时候都没有意义的名称。
https://stackoverflow.com/questions/27212766
复制相似问题