C++ 如果我在C或C+中使用'typedef'+;,我什么时候应该在typedef'的末尾添加`_t`;埃德型?

C++ 如果我在C或C+中使用'typedef'+;,我什么时候应该在typedef'的末尾添加`_t`;埃德型?,c++,c,typedef,C++,C,Typedef,我不知道什么时候应该将尾部的\u t添加到typedef'ed类型 例如,我应该这样做: typedef struct image image_t; typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type_t; 或者这个: typedef struct image image; typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type

我不知道什么时候应该将尾部的
\u t
添加到
typedef
'ed类型

例如,我应该这样做:

typedef struct image image_t;
typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type_t;
或者这个:

typedef struct image image;
typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type;
一般规则是什么

另一个例子,我应该这样做:

typedef struct image image_t;
typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type_t;
或者这个:

typedef struct image image;
typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type;
请开导我


谢谢,博达·西多。

我个人鄙视
\u t
惯例。不过,只要你始终如一,这真的不重要


请注意(正如这里的其他答案所指出的),如果您正在按照其他标准(如POSIX)编码,那么在使用这些名称之前,您需要检查该标准中的名称是否正确。

在POSIX中,以
\u t
结尾的名称是保留的,因此如果您针对的是POSIX系统(如Linux),您不应该以
\u t

结束您的类型。我正在使用
\u t
作为枚举和基元类型的后缀来区分它们与变量。我将它们放在名称空间中,所以我不关心
\t
保留


为了证明这一点。变量名通常是对typedefed类型的暗示。像
std::size\u t size
array\u t array
等。我发现,当类型包含
\u t
后缀时,为变量选择合适的名称更容易。它还提醒我,它是一个typedefed原语,而不是其他类似野兽的类。

为类型选择好的名称,就像变量、函数和其他任何东西一样。一个好的名字不会有多余的信息嵌入其中,这会使代码更难阅读——如果你一开始就有一个好名字,这对你没有任何帮助


顺便说一下:
typedef图像没有任何意义,因为它只是使图像本身成为一个typedef。

什么时候应该使用
\u t
?从未?它是由一个主要标准(POSIX)保留的,即使现在不是,您的代码可能有一天会在POSIX环境中使用,所以使用
\u t
是个坏主意

我想进一步指出,过度使用
typedef
通常是不好的。如果您的类型是
struct
union
enum
,请在声明变量时使用这些关键字,这样可以使代码更加清晰。使用
typedef
最好是在您希望使基础类型不可见以进行抽象/封装时使用。标准C中的几个很好的例子是
size\u t
int32\u t
mbstate\u t
,以及stdio
文件


typedef
的一些最严重的滥用是由Windows API(
WORD
DWORD
INT
LPSTR
等)和glib(
gint
gchar
等)造成的。使用相同的预期用途复制标准C类型只会让人困惑,而且会污染所有非标准类型名称的代码,从而将开发人员锁定在您的库/平台中。

我使用后缀来提高可读性:\t用于typedef,e用于25/30年以来的枚举。。。有时我在typedef定义结构时使用_st

我认为这是使代码可读性和标准化的良好实践,然后我发现使用后缀是正确的!此外,到目前为止,我还没有发现任何POSIX官方文件声明保留后缀_t


旧stdio.h包含_t。。。请看:grep-i“\t;”stdio.h:)我认为POSIX标准比C“稍微”年轻

从来没有。以
\u t
结尾的类型名称由某些标准保留(不确定是哪种)。不管你做什么,都不要做
\u键入\u t
。选择
\u type
\t
(或其他内容),但请不要堆叠它们。“那太傻了!”比利-搜索了一下,我想是POSIX。向下滚动,詹姆斯·麦克内利斯打败了我。@Billy@Chris:对不起,我没有参考链接;限制和引用可在POSIX中保留的以
结尾的标识符的答案中找到。我并不太注意这一点(我经常键入以
\u t
结尾的名称)。@MichaelBurr那篇文章说“实现可以向下表所示的标题添加符号,只要这些符号的标识符是:[……]以表中表示为保留后缀的字符串结尾,不要使用保留前缀posix、posix或posix,只要保留后缀位于实现认为重要的名称部分。”因此,表中说,您可以对任何标题中定义的类型使用
\t
,你经常可以在很长一段时间内摆脱它,但是如果你移植到一个新的平台,或者平台的新版本,并且发现冲突,你就不会在任何人身上卷土重来。所以,不使用后缀是最安全的。很多坏掉的API也是如此。这并不意味着你应该复制他们的不良行为。@ doc:标准C库不使用C++命名空间。@ JAMESMCNELIS,我发现它太大了,从“执行者可以使用<代码> < t >代码>任何地方”到“没有人可以使用<代码>除非有文档专门为POSIX使用保留
\u t
,否则我认为此表被误解了。@user23743“实现者可以在任何地方使用
\u t
”意味着他们可以使用
\u t
定义宏,这意味着您对
\u t
的任何使用都要进行宏替换。
size\u t size\u t=0
在C中是合法的-它声明了一个名为
size\u t
的变量,类型为
size\u t
。类型和变量之间的冲突无关紧要。然后代码的可读性就变成了空白。这同样适用于
size=0 > @ Chris Lutz:你读过“区分变量”吗?他使用的例子是“代码> TyPulfFrimeSimultIsIGIVIONION/CODE >,在C++中C.是有用的,<代码>结构图像变量可以声明为代码>图像X;<但是在C中,您必须声明它们
struc