在C中区分typedef的类型/标签名称有什么好处?

一些代码库为tagtype使用不同的标识符,例如:

 typedef struct _foo { int bar; } foo; 

代替:

 typedef struct foo { int bar; } foo; 

这里将详细解释这些差异: C ++中’struct’和’typedef struct’之间的区别?
(注意,这个问题是关于C的,并且链接是一个C ++问题,所以我假设该答案的基础也适用于C,尽管可能不是这种情况,或者可能存在一些细微差别) 。


我的问题是:

对类型名称空间和全局名称空间使用不同的标识符有什么实际优势 (如果有的话)

是否有充分的理由去做另一个? (在某些条件下)..
或者这只是一个惯例?

在我看来,没有真正的优势。 struct标签和typedef名称位于不同的“名称空间”中(而不是C ++意义上的namespace ),因此对于两者使用相同的名称并没有真正的问题。

声明

 typedef struct foo { int bar; } foo; 

完全有效,名称struct foo和名称foo之间不存在冲突。 struct标记只能在struct关键字后面立即出现。

某些IDE可能会有一些小优势。 例如,如果您使用单击标识符并使​​用显示该标识符声明的function,则可能存在一些歧义; 它可以显示typedef名称或标签。 但由于两者都指的是同一类型,这应该不是什么大问题。

如果你想避免使用名称struct foo ,更喜欢typedef名称foo ,那么为struct标签使用不同的标识符可以提醒你不要使用它。 例如:

 typedef struct foo_s { int bar; } foo; 

可以作为提醒,以避免名称foo_s

除此之外,在我看来,结构类型的typedef不是必需的。 我将上述内容简单地定义为:

 struct foo { int bar; }; 

并将类型称为struct foo 。 我个人认为定义一个新名称foo并没有太大的好处,对于一个已经有一个非常好的名字struct foo 。 唯一的例外是抽象类型,您希望隐藏它是一个结构的事实。 在键入FILE就是一个例子。

另一方面,很多优秀的C程序员在这一点上不同意我的看法,并认为定义一个只是标识符的名称是值得的。

没有明显的优势。 事实上,总是使用相同的名称可能是一个好习惯。

使用不同名称的做法很可能具有历史根源。 我发现它起源于一些特定实现的故障(而不是由一些过时的语言规范强制要求),我不会感到惊讶。

区分typedef类型/标记名称的优点

教育struct名称和标签名称的差异的概念很容易混淆C的学生。通过使用不同的名称,可以更清楚地解释示例。

 typedef struct foo_S { int bar; } foo_T; // legal struct foo_S s1; foo_T t1; // illegal foo_S s2; // struct foo_T is not yet defined. struct foo_T t2; 

[编辑]

DRY :标准使用的_t追加表示许多类型。 后缀_t由某些操作系统保留用于将来的类型。 结果是使用一些后缀/前缀成为C风格的习惯用语,表示名称是类型而不是变量。 例:

 typedef struct point { int x,y; } point_T; point_T center; 

如果代码使用struct ,则不需要后缀:

 struct point center; 

IMO, struct或标签使用相同/不同的名称取决于工作组编码标准和目标。 由于C允许任何一种方法,我简单地适应我的小组的标准(实用与教条)。