C类型命名约定,_t或ALLCAPS

我一直想知道是否有任何命名对象,如何使用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库更加一致,坦率地说……

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

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

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

在任何情况下,不要使用ALL CAPS因为它非常难看,并且不使用_t因为它是由POSIX保留的。 如果你恰当地为你的类型名称添加前缀可能并不重要,但最后的_t只是不必要的丑陋和无偿的不可移植性。 像这样添加前缀应该没问题: foo_scalar (其中foo是库/模块的名称)。

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

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

您可能还想在标准中查找有关预留标识符的部分。 这是我的N1570副本所说的:

7.1.3保留标识符

1每个标头声明或定义其相关子条款中列出的所有标识符,并可选地声明或定义其关联的未来库方向子条款和标识符中列出的标识符,这些标识符始终保留用于任何用途或用作文件范围标识符。 – 所有以下划线开头的标识符以及大写字母或另一个下划线始终保留用于任何用途。 – 所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。

– 如果包含任何相关标题,则保留以下任何子条款中的每个宏名称(包括未来的库方向)以供指定使用; 除非另有明确说明(见7.1.4)。

– 以下任何子条款中包含外部链接的所有标识符(包括未来的库方向)和errno始终保留用作具有外部链接的标识符.84)

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

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

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

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

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

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

uint8_t等是命名类型的一种非常常见的方式,我们可以从标准中看到。 另一种常见的方式就是This只有第一个字母的首都。