C类型命名约定,_t或ALLCAPS

时间:2012-04-27 19:22:03

标签: c types naming-conventions

我一直想知道是否有任何命名对象,如何使用ALLCAPS作为类型以及何时追加_t(何时不使用任何东西?)。我知道K& R发布了有关如何使用C的各种文件,但我找不到任何相关内容。

在C标准库类型中,_t似乎是优势的

time_t
clock_t
uint32_t
size_t
sig_atomic_t
...

,而不是FILEva_liststruct tm。实际上有规则还是完全随意的? Microsoft总是在他们的Windows API中使用ALLCAPS中的类型名称,至少看起来比C库更加一致,坦率地说......

7 个答案:

答案 0 :(得分:10)

实际上根据POSIX标准,所有以_t结尾的类型名称都是保留的,如定义的here

  

以'_t'结尾的名称保留用于其他类型名称。

答案 1 :(得分:7)

我会努力尽量减少您对typedef的使用。对结构使用struct关键字,只有在(a)定义可能实现为任何内容的opaque类型时,才使用typedef,或者(b)为您可能想要更改的算术类型定义别名未来或不同的配置(例如,如果您希望能够选择floatdouble)。

在任何情况下,不要使用ALL CAPS,因为它很丑陋,并且不使用_t,因为它是由POSIX保留的。如果你恰当地为你的类型名称添加前缀可能并不重要,但最后的_t只是不必要的丑陋和无偿的不可移植性。只需为它们加上前缀就可以了:foo_scalar(其中foo是您的库/模块的名称)。

答案 2 :(得分:4)

它完全是任意的 - 不同的库编写者/标准使用不同的约定(或根本没有约定)。只需为您的代码选择一个并保持一致。

答案 3 :(得分:3)

由于您提到的类型可能已经从多个标准(例如POSIX)和不同的主导实现中累积,因此没有任何类型。一个典型的例子是xstrassert这两个都是小写的宏。但是请确保您已阅读C-FAQ 12.9并且您应该好好去。

您也可以在标准中查找有关预留标识符的部分。以下是我的N1570副本所说的内容:

  

7.1.3保留标识符

     

1每个标头声明或定义其关联子条款中列出的所有标识符,也可以选择   声明或定义其关联的未来中列出的标识符   库指示子条款和始终保留的标识符   用于任何用途或用作文件范围标识符。 - 全部   以下划线和大写字母开头的标识符   字母或其他下划线总是保留用于任何用途。 - 全部   以下划线开头的标识符始终保留供使用   作为普通名称和标记名称中具有文件范围的标识符   空间。

     

- 以下任何子条款中的每个宏名称   (包括未来的图书馆方向)保留用作   指定是否包含任何相关标头;除非   另有明确说明(见7.1.4)。

     

- 所有标识符   以下任何子条款中的外部联系(包括   未来的图书馆方向)和errno总是保留用作   具有外部联系的标识符.84)

     

- 每个标识符都带有文件   以下任何条款中列出的范围(包括未来   库方向)保留用作宏名称和   具有相同名称空间的文件范围的标识符(如果有)   包含相关标头。

     

2没有保留其他标识符。   如果程序在上下文中声明或定义标识符   它是保留的(除了7.1.4允许的),或定义保留   标识符作为宏名称,行为未定义。

     

3如果   程序删除(使用#undef)标识符的任何宏定义   上面列出的第一组,行为未定义。

答案 4 :(得分:1)

最常见的惯例是您对宏使用全部大写(仅限)(无论它是否恰好是类型)。

答案 5 :(得分:1)

所有CAPS最常用于常量和/或宏。我没有在其他任何地方遇到过它,但在Windows API中并不推荐它。

正如我们从标准中可以看到的那样,uint8_t等是命名类型的一种非常常见的方式。另一种常见方式是This只有首字母大写。

答案 6 :(得分:1)

ALLCAPS通常(非普遍)用于宏,根据我的经验,很少用于类型定义。我见过的最常见的类型名称约定是LeadingUpperMixedCase或_t后缀(其他人指出可能会导致与POSIX发生冲突)