1. 命名规范总则:为什么需要统一的命名规范?

说实话,我见过太多因为命名混乱导致的惨案了。

有一次,我接手一个老项目。打开代码一看,同一个变量,有人叫 pData,有人叫 data_ptr,还有人叫 m_data。你猜怎么着?这三个其实是同一个东西。调试了整整两天,最后发现是命名不一致导致的理解偏差。嗯,从那以后,我对命名规范这件事就特别较真。

为什么非要统一命名?

说白了,命名规范不是为了好看,是为了保命。嵌入式开发里,代码的可读性直接决定了你的调试效率。我总结了几点:

  • 降低认知负担:看到名字就知道它是什么、干什么用。不用每次都得翻定义。
  • 减少沟通成本:团队里大家写出来的代码风格一致,互相 review 的时候不会因为命名吵起来。
  • 避免低级错误:变量名和函数名混淆?我见过有人把 ij 搞混,结果循环跑飞了。
  • 方便工具分析:静态检查工具、代码搜索工具,对规范的命名更友好。

核心原则:命名要自解释。好的命名,不需要注释也能看懂。坏的命名,写再多注释也是白搭。

三种主流命名风格对比

市面上常见的命名风格,其实就三种。我一个个说。

1. 匈牙利命名法

这个老古董了。变量名前面加类型前缀,比如 iCount(int 类型)、pBuffer(指针类型)。Windows 时代的产物。

我个人不太推荐在嵌入式 C 里用。为什么?因为现代 IDE 都能直接显示类型了,你写个前缀反而啰嗦。而且,如果你改了变量类型,还得改名字,麻烦不麻烦?

避坑指南:我曾经在一个项目里看到有人用 ulData 表示 unsigned long,后来需求变了,改成 int,结果名字没改。新同事接手时以为还是 unsigned long,直接溢出。你说冤不冤?

2. 驼峰命名法

这个大家应该很熟悉。首字母小写,后面每个单词首字母大写,比如 getDataLengthsetMotorSpeed

优点是紧凑、好读。缺点嘛,在嵌入式里,有时候宏定义和变量名容易混淆。而且,有些老派的嵌入式工程师觉得驼峰太「软」,不够硬核。

我个人习惯:函数名用驼峰,变量名用下划线。这样一眼就能区分。

3. 下划线命名法

全小写,单词之间用下划线隔开,比如 get_data_lengthmotor_speed。Linux 内核和很多嵌入式 RTOS 都这么用。

说实话,这是我最推荐嵌入式 C 用的风格。原因很简单:

  • 全小写,不用纠结大小写问题
  • 下划线分隔,可读性高
  • 和标准库风格一致(想想 strcpymemcpy

到底选哪个?

你想想看,嵌入式 C 代码最怕什么?最怕花里胡哨。我们追求的是稳定、可维护。所以我的建议是:

场景 推荐风格 示例
变量名 下划线命名法 adc_valuetimer_count
函数名 下划线命名法 uart_send_bytegpio_set_level
宏定义 全大写 + 下划线 BUFFER_SIZEGPIO_PIN_5
类型定义 下划线 + _t 后缀 motor_config_tuart_handle_t

小技巧:如果你团队里有人坚持用驼峰,也不是不行。但一定要统一。最怕的是「混搭风」——同一个文件里,一半驼峰一半下划线。那才是真正的灾难。

我个人的命名铁律

做了这么多年嵌入式,我总结了几条铁律,分享给你:

  1. 不要用拼音shebei_zhuangtai 这种东西,看着就头疼。英文不好可以查词典,别偷懒。
  2. 不要用单个字母:除了循环变量 ij,其他情况尽量别用。你写的 a,三个月后你自己都看不懂。
  3. 不要用缩写:除非是行业通用缩写(比如 ADCPWM),否则老老实实写全称。cnt 不如 countcfg 不如 config
  4. 不要用否定命名is_not_ready 这种,逻辑上容易搞混。用 is_ready,然后取反。

嗯,大概就这些。命名规范这件事,说大不大,说小不小。但你要知道,好的代码是写给人看的,顺便给机器执行。命名规范,就是让「人」这部分更顺畅。

下一节,我们聊聊具体的变量命名规则。到时候我会拿几个真实项目里的坑,给你掰扯掰扯。