C 语言中最常见的命名约定是什么?

C 语言中通常使用的命名约定是什么? 我知道至少有两种:

  1. 具有小写 _ case _ function 的 GNU/linux/K & R
  2. ? name? 具有 UpperCaseFoo 函数

我在这里只谈 C 语言,我们的大多数项目都是小型嵌入式系统,我们在其中使用 C 语言。

下面是我计划在下一个项目中使用的工具:


变数命名原则

Struct              TitleCase
Struct Members      lower_case or lowerCase


Enum                ETitleCase
Enum Members        ALL_CAPS or lowerCase


Public functions    pfx_TitleCase (pfx = two or three letter module prefix)
Private functions   TitleCase
Trivial variables   i,x,n,f etc...
Local variables     lower_case or lowerCase
Global variables    g_lowerCase or g_lower_case (searchable by g_ prefix)
223020 次浏览

“结构指针”不是需要变数命名原则子句来覆盖它们的实体。他们只是 struct WhatEver *。不要隐藏这样一个事实,即有一个指针涉及到一个聪明和“显而易见”的 typedef。它没有任何用处,键入时间更长,并且破坏了声明和访问之间的平衡。

首先,C 没有公共/私有/虚拟函数,这就是 C + + ,它有不同的约定:

  • ALL _ CAPS 中的常量
  • 用下划线来划分结构或函数名称中的单词,在 C 语言中几乎看不到驼峰大小写;
  • Struct,typedefs,union,member (联合和结构的)和 enum 值通常是小写的(根据我的经验) ,而不是 C + +/Java/C #/etc 的约定,使第一个字母成为大写,但我想这在 C 中也是可能的。

C + + 更复杂。我在这里看到了真正的混音。用于类名或小写 + 下划线的驼峰大小写(驼峰大小写在我的经验中更常见)。结构很少使用(通常是因为库需要它们,否则您将使用类)。

我建议不要混合使用驼峰大小写和下划线分离(就像您为 struct 成员建议的那样)。这太让人困惑了。你会想,我有 get_length所以我应该有 make_subset然后你会发现它实际上是 makeSubset。使用最小惊讶原则,保持一致。

我发现 CamelCase 对类型名很有用,比如 structs、 typedef 和 enum。差不多就这些了。对于所有其余部分(函数名、 struct 成员名等) ,我使用下划线 _ 分离。

这里最重要的是一致性。也就是说,我遵循 GTK + 编码约定,它可以总结如下:

  1. 所有宏和常量大写: MAX_BUFFER_SIZETRACKING_ID_PREFIX
  2. 驼形文件中的结构名称和 typedef: GtkWidgetTrackingOrder
  3. 操作 structs 的函数: 经典 C 风格: gtk_widget_show()tracking_order_process()
  4. 提示: 这里没什么特别的: GtkWidget *fooTrackingOrder *bar.
  5. 全局变量: 只是不要使用全局变量。它们是邪恶的。
  6. 函数,但是 不应该被直接称为,或者已经 模糊的用途,或者其他什么: 一个或多个 在开头强调: _refrobnicate_data_tables()_destroy_cache().

我被一件事搞糊涂了: 你计划为一个新项目创建一个新的变数命名原则。一般来说,你应该有一个全公司或全团队的变数命名原则。如果您已经拥有具有任何形式变数命名原则的项目,则不应更改新项目的约定。如果上面的约定只是对您现有实践的编纂,那么您就是黄金。它与现有的 事实上标准差异越大,就越难在新标准中获得认可。

我要补充的唯一建议是,我喜欢在类型的末尾使用 uint32 _ t 和 size _ t 样式的 _ t。对我来说,它非常 C-ish,尽管有些人可能会抱怨它只是“反向”的匈牙利语。

这里有一个(显然)不常见的名称,我发现它很有用: CamelCase 中的模块名称,然后是下划线,然后是 CamelCase 中的函数或文件作用域名称。例如:

Bluetooth_Init()
CommsHub_Update()
Serial_TxBuffer[]

同时,我采用了一种非常简单明了的变数命名原则来简化我的生活。

首先,它依赖于现代 IDE (如 eclipse、 Xcode...)的强大功能,可以通过鼠标悬停或 ctrl 单击来获得快速信息。 接受这一点,我禁止使用任何前缀、后缀和 IDE 简单提供的其他标记。

然后,大会:

  • 任何名字必须是一个可读的句子,解释你有什么。像“这是我的约定”。
  • 然后,从一个句子中得到一个约定的四种方法:
    1. 对于宏、枚举成员,此 _ IS _ MY _ CONVENTION
    2. ThisIsMyConvention 用于文件名、对象名(class、 struct、 enum、 union...)、函数名、方法名、 typedef
    3. This _ is _ my _ Convention 全局和局部变量,
      参数、结构元素和联合元素
    4. 这是我的约定 [可选]非常本地和临时的变量(比如 for ()循环索引)

就是这样。

它给

class MyClass {
enum TheEnumeration {
FIRST_ELEMENT,
SECOND_ELEMENT,
}


int class_variable;


int MyMethod(int first_param, int second_parameter) {
int local_variable;
TheEnumeration local_enum;
for(int myindex=0, myindex<class_variable, myindex++) {
localEnum = FIRST_ELEMENT;
}
}
}

您还应该考虑使用 词序来简化 自动命名补全

一个好的实践: 库名 + 模块名 + 操作 + 主题

如果一个部分不相关,只要跳过它,但至少模块名称和动作总是应该提出。

例子:

  • 函数名: os_task_set_priolist_get_sizeavg_get
  • 释义(这里通常没有 开拍部分) : OS_TASK_PRIO_MAX

可能有很多,主要是 IDE 决定了一些趋势,C + + 约定也在推动:

  • UNDERSCORED _ UPPER _ CASE (宏定义、常量、枚举成员)
  • 省略号 _ low _ case (变量,函数)
  • CamelCase (自定义类型: 结构、枚举、联合)
  • UncappedCamelCase (oppa Java 风格)
  • UnderScored _ CamelCase (名称空间类型下的变量、函数)

对于 globals 来说,匈牙利命名法是可以的,但对于类型来说就不行了。 甚至对于琐碎的名称,请至少使用两个字符。

你知道,我喜欢保持简单,但清晰... 所以这是我用的,在 C:

  • 平凡的变量 : i,n,c等等(只有一个字母,如果一个字母不是 然后将其设置为局部变量)
  • 局部变量 : camelCase
  • 全局变量 : g_camelCase
  • Const 变量 : ALL_CAPS
  • 指针变量 : 在前缀中添加一个 p_。对于全局变量,它是 gp_var; 对于局部变量,它是 p_var; 对于常量变量,它是 p_VAR。如果使用了 far 指针,那么使用 fp_而不是 p_
  • 结构 : ModulePascalCase(Module = full Module name,或2-3个字母缩写,但仍使用 PascalCase)
  • 结构成员变量 : camelCase
  • 枚举 : ModulePascalCase
  • 枚举值 : ALL_CAPS
  • 公共职能 : ModulePascalCase
  • 私有函数 : PascalCase
  • : PascalCase

我键入了我的结构,但使用相同的名称 标签和 typedef。标签不是用来普遍使用的。 相反,最好使用 typedef。我还在用于封装的公共模块头部中转发声明 typedef,这样我就可以在定义中使用 typedef 的名称。

完整 struct 例子:

typdef struct UtilsExampleStruct UtilsExampleStruct;
struct UtilsExampleStruct{
int var;
UtilsExampleStruct *p_link;
};

我认为这些对初学者有帮助: C 中变量的变数命名原则

  1. 您必须使用字母字符(A-Z,A-Z) ,数字(0-9)和低分(_)。不允许使用任何特殊字符,如:% 、 $、 # 、@等。因此,可以使用 User _ name作为变量,但不能使用 用户及名称
  2. 不能在单词之间使用空格。因此,可以使用 User _ name 或用户名或用户名作为变量,但不能使用 用户名
  3. 无法以数字开始命名。因此,可以使用 User1或 user2作为变量,但不能使用 1使用者
  4. 它是区分大小写的语言。大写和小写都很重要。如果你使用像 用户名这样的变量,那么你就不能使用 用户名或用户名作为父亲使用。
  5. 变量声明不能使用任何关键字 (char、 int、 if、 for、 while 等)
  6. ANSI 标准识别变量名的长度为31个字符

当我用 C 语言编程时,我会使用这个约定:

定义 前缀 例子
变量-局部 (琐碎) / inab... < br/> iinnaabb... < br/> iiinnnn0,n1...
可变局部 (描述性) / variableconection...
全局变量 g_ g_variableg_connection...
变量常数变量常数 c_ c_variablec_connection...
指针 p_ p_variablep_connection...
数组 a_ a_variablea_connection...
结构 s_ s_variables_connection...
工会 u_ u_variableu_connection...
枚举 e_ e_variablese_connection...
Struct (委员) < br/> union (委员) < br/> enum (委员) m_ < br/> m_ < br/> m_ m_variablem_connection... < br/> m_variablem_connection... < br/> m_variablem_connection...
结构 (位域) b_ b_variableb_connection...
功能 f_ f_variablef_connection...
宏观 o_ o_variableo_connection...

注:

除了变量之外的每个定义都有一个单字母前缀,这样它们就可以组合在一起,而不会被错过。

注:

因为我的字母用完了,而且我坚持只使用小写字母前缀,所以用于宏的前缀“ o_”不匹配定义中的第一个字母(acro) ,但是它匹配最后一个字母(macr)。

如果你有任何建议,我是开放的思想。

我建议你阅读这份文件。

摘要
本文件是印度希尔 C 风格和编码标准论文的更新版本,经过最近三位作者的修改。它描述了一个推荐的 C 程序编码标准。范围是编码风格,而不是功能性组织。

Https://www.doc.ic.ac.uk/lab/cplus/cstyle.html#n1026f