9

我一直想知道是否有任何命名约定,例如何时将 ALLCAPS 用于类型以及何时附加_t(以及何时不使用任何东西?)。我知道过去 K&R 发布了有关如何使用 C 的各种文档,但我找不到任何关于此的内容。

在 C 标准库类型中,_t似乎占主导地位

time_t
clock_t
uint32_t
size_t
sig_atomic_t
...

, 而不是FILE,va_liststruct tm. 这实际上有规则还是完全任意的?微软总是在他们的 Windows API 中使用 ALLCAPS 中的类型名,坦率地说,这至少看起来比 C 库更一致......

4

7 回答 7

11

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

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

于 2012-04-27T19:31:00.993 回答
8

我会努力尽量减少您对typedef. 对结构使用struct关键字,并且仅在以下情况下使用 typedef配置(例如,如果您希望能够选择floatdouble)。

在任何情况下,不要使用 ALL CAPS,因为它非常丑陋,也不要使用_t,因为它是 POSIX 保留的。如果您适当地为类型名称添加前缀,那可能并不重要,但_t最后只是不必要的丑陋和无缘无故的不可移植性。只需像这样为它们添加前缀就可以了:(您的库/模块的名称在foo_scalar哪里)。foo

于 2012-04-27T22:23:48.673 回答
4

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

于 2012-04-27T19:25:46.220 回答
3

没有任何类型,因为您提到的类型可能是多年来从跨标准(例如 POSIX)和不同的主要实现中积累起来的。一个例子是xstrassert两者都是小写的宏。但是,请确保您已阅读C-FAQ 12.9,您应该一切顺利。

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

7.1.3 保留标识符

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

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

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

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

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

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

于 2012-04-27T19:31:44.957 回答
1

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

于 2012-04-27T19:26:22.793 回答
1

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

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

于 2012-04-27T19:54:12.533 回答
1

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

于 2012-04-27T20:41:47.037 回答