Jef*_*ffV 114 c naming-conventions
C中常用的命名约定是什么?我知道至少有两个:
我只在这里谈论C.我们的大多数项目都是使用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)
Run Code Online (Sandbox Code Playgroud)
axe*_*l_c 116
这里最重要的是一致性.也就是说,我遵循GTK +编码惯例,可归纳如下:
MAX_BUFFER_SIZE,TRACKING_ID_PREFIX.GtkWidget, TrackingOrder.gtk_widget_show(), tracking_order_process().GtkWidget *foo,TrackingOrder *bar._refrobnicate_data_tables(),_destroy_cache().unw*_*ind 28
"结构指针"不是需要命名约定子句来覆盖它们的实体.他们只是struct WhatEver *.不要隐瞒一个指针涉及一个聪明且"明显"的typedef这一事实.它没有用处,打字时间更长,破坏了声明和访问之间的平衡.
cle*_*tus 14
首先,C没有公共/私有/虚拟功能.这是C++,它有不同的约定.在C中通常你有:
C++更复杂.我在这里看到了真正的混音.用于班级名称或小写+下划线的驼峰案例(根据我的经验,骆驼案例更为常见).结构很少使用(通常因为库需要它们,否则你会使用类).
Sea*_*mey 10
你知道,我喜欢保持简单,但要清楚......所以这就是我在C中使用的内容:
i,n,c等等...(只有一个字母.如果一个字母不清楚,那么将其变为局部变量)lowerCamelCaseg_lowerCamelCaseALL_CAPSp_在前缀中添加一个.对于全局变量gp_var,对于局部变量p_var,它将是const变量p_VAR.如果使用远指针则使用fp_而不是p_.ModuleCamelCase模块=完整模块名称,或2-3字母缩写,但仍在CamelCase.)lowerCamelCaseModuleCamelCaseALL_CAPSModuleCamelCaseCamelCaseCamelCase我输入我的结构,但对标签和typedef使用相同的名称.标签并不常用.相反,最好使用typedef.我还在public模块头中声明了typedef以进行封装,以便我可以在定义中使用typedef'd名称.
完整 struct 示例:
typdef struct TheName TheName;
struct TheName{
int var;
TheName *p_link;
};
Run Code Online (Sandbox Code Playgroud)
在C#,java,C,C++和目标C的同时编码,我采用了一种非常简单明了的命名约定来简化我的生活.
首先,它依赖于现代IDE的强大功能(例如eclipse,Xcode ......),可以通过悬停或ctrl单击来获取快速信息......接受这一点,我禁止使用任何前缀,后缀以及IDE提供的其他标记.
然后,惯例:
就是这样.
它给
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我建议不要混合驼峰案例和下划线分离(就像你为结构成员提出的那样).这令人困惑.你会想,嘿,我有,get_length所以我应该有make_subset,然后你发现它实际上makeSubset.使用最不惊讶的原则,并保持一致.
我确实发现CamelCase对于类型名称很有用,比如结构,typedef和枚举.但这就是全部.对于所有其余的(函数名,结构成员名等),我使用underscore_separation.
这是一个(显然)不常见的,我发现它很有用:CamelCase中的模块名称,然后是CamelCase中的下划线,函数或文件范围名称.例如:
Bluetooth_Init()
CommsHub_Update()
Serial_TxBuffer[]
Run Code Online (Sandbox Code Playgroud)
您还应该考虑单词的顺序,以使自动名称完成更容易。
一个好的做法:库名称+模块名称+操作+主题
如果某个部分不相关,则跳过它,但至少应始终显示模块名称和操作。
例子:
os_task_set_prio, list_get_size,avg_get OS_TASK_PRIO_MAX