如果我在C或C++中使用`typedef`,何时应该在typedef'ed类型的末尾添加`_t`?

bod*_*ydo 48 c c++ typedef

我什么时候应该将尾随添加_ttypedef'ed类型?

例如,我应该这样做:

typedef struct image image_t;
Run Code Online (Sandbox Code Playgroud)

或这个:

typedef struct image image;
Run Code Online (Sandbox Code Playgroud)

一般规则是什么?

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

typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type_t;
Run Code Online (Sandbox Code Playgroud)

或这个:

typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type;
Run Code Online (Sandbox Code Playgroud)

请赐教.

谢谢,Boda Cydo.

Jam*_*lis 58

在POSIX中,以结尾的名称_t是保留的,因此如果您的目标是POSIX系统(例如,Linux),则不应该使用_t.

  • 许多破坏的API也是如此.这并不意味着你应该复制他们的不良行为. (11认同)
  • 根据经验,您可以经常使用它很长一段时间 - 但如果您移植到新平台或平台的新版本并且发现冲突,则无法回复任何人.因此,最安全的是不使用后缀. (6认同)
  • @doc:标准C库不使用C++名称空间. (6认同)
  • @JamesMcNellis我发现,"实施者可能会在任何地方使用`_t`"到"没有人可能会使用`_t`"这一信念太大了.除非有一个_specifically_ reserve`_t`用于POSIX使用的文档,否则我觉得这个表被误解了. (4认同)
  • @ user23743"实现者可以在任何地方使用`_t`"意味着他们可以使用`_t`定义宏,这意味着你对`_t`的任何使用都要进行宏替换. (4认同)
  • @loan:如果你看看[POSIX的规范的2008年修订版(http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html)和搜索页面"任何头,"有是保留标识符表之一的条目,保留后缀"_t" (3认同)
  • @Jonathan:是的.当然,根据经验,你可以逃避很多事情:-P (2认同)

Bil*_*eal 17

我个人鄙视这个_t大会.但是,只要你保持一致,那无关紧要.

需要注意的是(其他的答案在这里表示)如果你是编码一些其他的标准,如POSIX,你需要检查它是否使用这些名字之前是该标准还行.


R..*_*R.. 7

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

我会进一步说,过度使用typedef一般都很糟糕.如果你的类型是一个struct,union或者enum,当你声明的变量,它使你的代码更加清晰使用这些关键字.typedef当您希望使基础类型对于抽象/封装目的不可见时,最好保留使用.从标准C的一些很好的例子是size_t,int32_t,mbstate_t,和标准输入输出FILE.

一些最严重的侵犯typedef是由Windows API( ,WORD,,DWORD 等)和油嘴(,,等).使用相同的预期用法制作标准C类型的副本只会让人感到困惑,并且会通过使用这些非标准类型名称污染所有代码来锁定开发人员进入您的库/平台.INTLPSTRgintgchar

  • 除非你能提供有用的真实证据,否则我声称你是完全错的.`gint`没有定义为任何特定大小的整数; 它和`int`一样随意.如果油嘴API函数需要一个特定大小,则它们应该只使用这种类型的:例如`int32_t`如果他们需要的32位整数或`size_t`如果他们需要的对象的大小或数组索引等 (8认同)
  • @rubenvb Qt不是一个案例.它尽可能使用标准类型,如`int`,`bool`,`const char*`等.在需要解决某些问题时使用`qreal`等类型(Qt手册上的Qt手册:在所有平台上使用Typedef for double,除了那些使用带有ARM架构的CPU的平台.在基于ARM的平台上,qreal是float的typedef出于性能原因"). (3认同)
  • 同意 Windows API 部分,但不同意 glib,就此而言 Qt 也是如此:当支持大量平台时,有必要知道您正在处理的类型,并且 gint/qint 可能有不同的底层类型。另外:没有人会强迫使用 glib/Qt 的开发人员使用这些内部类型,因为它们只是“typedef”,您可以轻松地使用“int”而不是“gint”(当然,对于您的非奇异平台, 他们是一样的)。 (2认同)
  • 请注意,Windows API执行此操作的原因是Windows API类型应该是它们自己的类型; 可以从C以外的语言调用.因此,它的API调用不能用C类型定义.*nix操作系统通过告诉所有非C语言下地狱来避免这种情况; 但非Windows语言在Windows上比在Unix上更普遍. (2认同)

Sir*_*ack 5

我使用后缀来提高可读性:_t表示typedef,_e表示枚举自25/30岁...有时候我会在typedef定义结构时使用_st.

我认为让代码可读和标准化是一种很好的做法,然后我发现使用后缀是正确的!此外,到目前为止,我还没有找到任何POSIX官方文档,说明后缀_t是保留的.

旧的stdio.h包含_t ...参见:grep -i"_t;" stdio.h :)我认为POSIX标准比C更"年轻"!

  • 这个答案提到了POSIX标准中的参考:http://stackoverflow.com/a/12727104/1404081("所有符合要求的应用程序都需要避免以''_t''结尾的符号). (2认同)