我一直想知道是否有任何命名对象,如何使用ALLCAPS作为类型以及何时追加_t
(何时不使用任何东西?)。我知道K& R发布了有关如何使用C的各种文件,但我找不到任何相关内容。
在C标准库类型中,_t
似乎是优势的
time_t
clock_t
uint32_t
size_t
sig_atomic_t
...
,而不是FILE
,va_list
或struct tm
。实际上有规则还是完全随意的? Microsoft总是在他们的Windows API中使用ALLCAPS中的类型名称,至少看起来比C库更加一致,坦率地说......
答案 0 :(得分:10)
实际上根据POSIX标准,所有以_t结尾的类型名称都是保留的,如定义的here:
以'_t'结尾的名称保留用于其他类型名称。
答案 1 :(得分:7)
我会努力尽量减少您对typedef
的使用。对结构使用struct
关键字,只有在(a)定义可能实现为任何内容的opaque类型时,才使用typedef,或者(b)为您可能想要更改的算术类型定义别名未来或不同的配置(例如,如果您希望能够选择float
或double
)。
在任何情况下,不要使用ALL CAPS,因为它很丑陋,并且不使用_t
,因为它是由POSIX保留的。如果你恰当地为你的类型名称添加前缀可能并不重要,但最后的_t
只是不必要的丑陋和无偿的不可移植性。只需为它们加上前缀就可以了:foo_scalar
(其中foo
是您的库/模块的名称)。
答案 2 :(得分:4)
它完全是任意的 - 不同的库编写者/标准使用不同的约定(或根本没有约定)。只需为您的代码选择一个并保持一致。
答案 3 :(得分:3)
由于您提到的类型可能已经从多个标准(例如POSIX)和不同的主导实现中累积,因此没有任何类型。一个典型的例子是xstr
和assert
这两个都是小写的宏。但是请确保您已阅读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发生冲突)