在C中命名类型时要使用的样式

Mik*_*ler 8 c naming-conventions

根据这个堆栈溢出答案,类型名称上的"_t"后缀在C中保留.当typedef用于创建新的opaque类型时,我习惯在名称中使用某种类型的指示.通常我会选择类似的东西,hashmap_t但现在我还需要别的东西.

C中的类型是否有任何标准命名方案?在其他语言中,使用类似CapsCase Hashmap是常见的,但我看到的很多C代码根本不使用大写.CapsCase也可以很好地使用库前缀,比如XYHashmap.

因此在C中命名类型是否有通用规则或标准?

Jon*_*ler 6

是的,_t如果您包含任何POSIX标题,POSIX保留名称结尾,因此建议您在理论上保持清楚.在过去的二十多年里,我参与了一个与这些名字相冲突两三次的项目.您可以使用公司前缀(例如,您的公司的TLA和下划线),或使用混合大小写的名称(以及_t后缀)来最小化冲突风险; 所有我见过的碰撞已经短暂和全小写(dec_t,loc_t,...).

除了系统提供的(和系统保留的)_t后缀之外,没有特定的广泛使用的约定.其中一个混合案例系统(camelCase或InitialCaps)效果很好.系统前缀也很有效 - 更好的库往往会小心这些.

如果您决定使用小写和_t后缀,请确保使用足够长的名称并努力检查POSIX标准,您正在使用的主要平台,以及您认为可以处理的任何名称以避免不必要的冲突.当您example_t向客户发布一些名称然后发现某些新平台存在冲突时,会出现最严重的问题.然后你必须考虑让客户改变他们的代码,而他们总是不愿意这样做.最好先预先解决问题.


And*_*are 5

印山风格指南有一些建议:

毫无疑问,个别项目有自己的命名惯例.但是有一些一般规则.

  • 带有前导和尾部下划线的名称是为系统目的保留的,不应用于任何用户创建的名称.大多数系统将它们用于用户不应该知道的名称.如果您必须拥有自己的私有标识符,请从一两个字母开始标识它们所属的包.

  • #define 常数应该在所有CAPS中.

  • 枚举常量是大写的或在所有CAPS中

  • 函数,typedef和变量名称以及struct,union和enum标记名称应为小写.

  • 许多宏"功能"都在所有CAPS中.某些宏(例如getchar和putchar)属于小写,因为它们也可能作为函数存在.只有当宏的行为类似于函数调用时,才能接受小写宏名称,也就是说,它们只对其参数进行一次评估,并且不为命名参数赋值.有时,即使参数只被评估一次,也不可能编写一个行为类似于函数的宏.

  • 避免仅在大小写方面有所不同的名称,如foo和Foo.同样,避免使用foobar和foo_bar.混淆的可能性很大.

  • 同样,避免看起来彼此相似的名称.在许多终端和打印机上,'l','1'和'I'看起来非常相似.名为'l'的变量特别糟糕,因为它看起来非常像常量'1'.

通常,全局名称(包括枚举)应具有标识其所属模块的公共前缀.或者,全局可以在全局结构中分组.Typedeffed名称通常在其名称后附加"_t".

避免使用可能与各种标准库名称冲突的名称.某些系统将包含比您想要的更多的库代码.此外,您的计划有一天可能会延长.

  • 这不建议使用与OP有问题的完全相同的约定吗?似乎是在回答一个与问题不同的问题,这个问题主要集中在类型上. (2认同)