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

标签 c types

一些代码库对标签类型使用不同的标识符,例如:

typedef struct _foo { int bar; } foo;

代替:

typedef struct foo { int bar; } foo;

这里详细解释了差异:Difference between 'struct' and 'typedef struct' in C++?
(请注意,这个问题是关于 C 的,链接指向一个 C++ 问题,因此我假设该答案的基础知识也适用于 C,尽管情况可能并非如此或可能存在一些细微差别)。


我的问题是:

对类型 namespace 和全局 namespace 使用不同的标识符有哪些实际优势(如果有的话)

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

最佳答案

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

声明

typedef struct foo {
    int bar;
} foo;

完全有效,名称 struct foo 之间没有可能的冲突和名字foo . struct 标签只能紧跟在 struct 之后关键字。

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

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

typedef struct foo_s {
    int bar;
} foo;

可以作为避免名字foo_s的提醒.

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

struct foo {
    int bar;
};

并将类型称为 struct foo .我个人认为定义一个新名称没有多大好处 foo , 对于已经拥有完美名称的类型 struct foo .唯一的异常(exception)是抽象类型,您希望在其中隐藏它是结构的事实。输入 FILE<stdio.h>就是一个例子。

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

关于c - 在 C 中区分 typedef 的类型/标签名称有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33848768/

相关文章:

C 链表临时变量

python - 在 Python 和 MySQL 中存储科学记数法的最有效方式

generics - 使用类型级计算时类型推断/类型检查失败

c# - 使用包含 Type 的变量创建 Generic<T> 类型实例

Scala抽象路径依赖类型问题

c# - 使用 GetType().ToString() (type1)+(type2) 意味着什么?

c - 在c中的结构中保留相同的变量

c - strcmp 行为怪异

c - 如果在 C 中响应时间太长,如何取消函数调用?

java - 在 Android ndk 的 C 库中测试异常处理程序