一些代码库对标签
和类型
使用不同的标识符,例如:
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/