什么是命名惯例通常用C使用? 我知道至少有二:
- 的GNU / Linux / K&R与lower_case_functions
- ? 名称 ? 与UpperCaseFoo功能
我只是在这里谈论℃。 我们的大多数项目都是在我们使用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)
这里最重要的事情是一致性。 这就是说,我按照GTK +编码约定,可以总结如下:
- 所有宏和常量的上限:
MAX_BUFFER_SIZE
, TRACKING_ID_PREFIX
。 - 结构的名称和类型定义的首字母大写:
GtkWidget
, TrackingOrder
。 - 上结构操作功能:经典的C风格:
gtk_widget_show()
tracking_order_process()
- 指针:没有什么花哨这里:
GtkWidget *foo
, TrackingOrder *bar
。 - 全局变量:只是不使用全局变量。 他们是邪恶的。
- 函数是有的,但不应该被直接调用,或有模糊的用途,或什么:在开始的一个或多个下划线:
_refrobnicate_data_tables()
_destroy_cache()
“结构指针”是不是需要一个命名约定条款支付他们的实体。 他们只是struct WhatEver *
。 不隐瞒的事实,那就是涉及一个聪明,“显而易见”的typedef指针。 这也是没有用处的,是更长的时间来输入,并破坏申报和获得之间的平衡。
那么首先C不具有公共/私营/虚函数。 这是C ++,它有不同的约定。 在C语言中,你通常有:
- 在ALL_CAPS常量
- 下划线划在结构或函数名的话,几乎没有你看到骆驼情况℃;
- 结构,类型定义,工会和枚举值(联合和结构)的成员通常是在较低的情况下(在我的经验),而不是C ++ / Java的/ C#/等制作的第一个字母大写的约定,但我想这是可能的ç过。
C ++是更复杂的。 我在这里看到一个真正的组合。 骆驼案例类名或小写+下划线(骆驼的情况是比较常见的在我的经验)。 结构是很少使用(通常是因为库需要他们,否则你会使用类)。
我会建议不要混合骆驼和下划线分离(如你提出了结构成员)。 这是令人困惑的。 你会想,嘿,我有get_length
所以我应该可能已经make_subset
,然后你发现它实际上是makeSubset
。 使用最小惊讶的原则,是一致的。
我确实觉得键入名称,如结构,typedef和枚举驼峰有用。 这就是全部,虽然。 对于所有的休息(函数名,结构成员的名字,等等),我用underscore_separation。
在C#,JAVA,C,C ++和Objective C的同时编码,我已经采取了非常简单和明确的命名约定,以简化我的生活。
首先,它依赖于现代IDE的力量(比如Eclipse,Xcode中...),与可能性悬停或Ctrl点击得到了快速的信息......接受的是,我抑制使用任何前缀,后缀和其他的标记,只是由IDE给出。
然后,约定:
- 任何名称必须是可读的一句话来说明你有什么。 像“这是我的约定”。
- 然后,4种方法得到一个惯例了一句话:
- THIS_IS_MY_CONVENTION为宏,枚举成员
- ThisIsMyConvention文件名,对象名(类,结构,枚举,工会...),函数名,方法名,类型定义
- this_is_my_convention全局和局部变量,
参数,struct和union元素 - thisismyconvention [可选]非常局部的暂时变量(例如像一个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;
}
}
}
下面是一个(显然)罕见之一,我发现有用:首字母大写的模块名称,然后下划线,然后工作或首字母大写的文件范围名。 因此,例如:
Bluetooth_Init()
CommsHub_Update()
Serial_TxBuffer[]
你知道,我喜欢保持简单,但清楚......因此,这里是我用的,在C:
- 琐碎的变量 :
i,n,c
(只有一个字母。如果一个字母是不明确的,则使其成为一个局部变量),等等。 - 局部变量 :
lowerCamelCase
- 全局变量 :
g_lowerCamelCase
- 常变量 :
ALL_CAPS
- 指针变量 :新增
p_
的前缀。 对于全局变量,这将是gp_var
,局部变量p_var
,为常变量p_VAR
。 如果使用远指针然后使用fp_
而不是p_
。 - 结构 :
ModuleCamelCase
(模块=全模块名称,或2-3个字母的缩写,但仍然在CamelCase
。) - 结构成员变量 :
lowerCamelCase
- 枚举 :
ModuleCamelCase
- 枚举值 :
ALL_CAPS
- 公共职能 :
ModuleCamelCase
- 私有函数 :
CamelCase
- 宏 :
CamelCase
我的typedef我的结构,但使用相同的名称,标签和类型定义两者。 标签并不意味着被普遍使用。 相反,它是preferrable使用的typedef。 我也向前声明typedef的公共模块头封装和这样我就可以在定义中使用typedef定义的名称。
全 struct
示例 :
typdef struct TheName TheName;
struct TheName{
int var;
TheName *p_link;
};
我被一件事困惑:你打算建立一个新项目一个新的命名约定。 一般来说,你应该有一个命名约定公司 - 或团队范围内。 如果您已经有任何形式的命名约定的项目,你不应该改变约定一个新的项目。 如果上述公约只是你的现行做法编纂,那么你是金色的。 越是它不同于现有的事实上的标准,就越难将成为新的标准,以获得心理份额。
关于我想补充的唯一建议是我采取了喜欢在类型uint32_t的类型和size_t的风格年底_t。 这是非常C-ISH我虽然有些可能会抱怨它只是“反转”的匈牙利。
你也应该想想的话 , 为了使汽车名完成更容易。
一个好的做法:库名+模块名+动作+主题
如果部分是不相关的就跳过它,但至少一个模块名称和动作总是应提交。
例子:
- 函数名称:
os_task_set_prio
, list_get_size
, avg_get
- 定义(这里一般不采取行动的一部分):
OS_TASK_PRIO_MAX
可能有很多,主要的IDE决定一些趋势和C ++约定推也。 对于C常用:
- UNDERSCORED_UPPER_CASE(宏定义,常量,枚举成员)
- underscored_lower_case(变量,函数)
- 驼峰(自定义类型:结构,枚举,工会)
- uncappedCamelCase(哥的Java风格)
- UnderScored_CamelCase(变量,在一种命名空间的功能)
对于全局匈牙利命名法是不错,但不适合的类型。 而且即使是俗名,请使用至少两个字符。