[开发笔记]关于匈牙利命名法

2013-12-19 Nie.Meining Life

由于项目需要,这段时间都在研究linux内核。感觉linux内核代码跟wrk的代码相比,风格上的最大区别是命名法。linuxer似乎都觉得匈牙利命名法是没有必要,甚至在内核编码规范中也明确抵制匈牙利命名法。但作为一名长期使用匈牙利命名法的码农,我个人觉得这种命名法在开发过程中还是能带来很大帮助的,尤其是可能帮助你避免很多潜在的bug,提高代码的严谨性举几个例子:


1. 假设你要给某个变量赋值:

unsigned short usLocal = g_usGlobal;

是的,不用疯狂向上滚屏去寻找 g_usGlobal 的声明了,我们知道它的类型是unsigned short。更给力的是,你能立刻知道 g_usGlobal 是一个全局变量,于是你被迫去思考这个地方是否会出现多线程竞争的问题……


2. 假设你顺手写了这样一行代码:

for (int i = 0; i < ulMax; ++i);

在敲出ulMax的同时,突然发现 i 和 ulMax 的 unsigned long 类型并不匹配, i < ulMax 可能导致潜在的bug



3. 假设你想给某个字符串赋值:

strcpy(strDst, szSrc);

咦?strDst 并不是 szDst。这意味着strDst很可能是个 char* 常量指针,于是你被迫去检查这里的 strcpy 是否合适。


4. 某个模块的任务终于完成了,开始释放资源准备退出,顺手把刚才的两个字符串也释放掉:

free(strSrc);
free(szSrc);
再次发现问题,szSrc 是 char [] 数组,这一定是手滑了。


类似的例子还有很多,不再列举了。总而言之,底层开发,伤不起……


另外除了命名法,还有一些其它的编码风格区别,顺便一提:

1. linux中规定一个缩进应该显示为8个空格,这个我不太习惯……

2. linux中word的概念代表字长,即cpu一次处理的数据量,32位系统是4字节,64位系统是8字节。Windows中的WORD大小恒为2字节;

3. linux中不提倡typedef,而Windows中到处都是typedef……这个我比较赞同,毕竟typedef隐藏了结构的含义,咱码农多敲几个字不嫌麻烦;

4. 注释风格。我个人还是喜欢windows的注释风格,参数类型/返回值说明等一目了然,方便查阅(msdn帮助文档就是从代码中提取注释自动生成的);

5. 这个其实不算代码风格的差异,不过在底层开发时需要注意,有些数据类型的大小不太一致,例如wchar_t在Windows中是两个字节,在Linux中是4个字节。例如long在64位Linux中是8个字节,在Windows中是4个字节;

6. 最后这个依然不算代码风格问题。在驱动开发中经常用到Windows内核提供的LINK_LIST数据结构,而linux不仅提供链表,还提供了队列、map、二叉树……算法也很多,例如两个链表能splice。码农表示热泪盈眶……

评论:

Sails鸢
2014-06-10 17:33
科学家,你这个空间付费吗?多少一年?oschina.net上写博客也不错啊,你取看看。
typedef 纯属是为了方便写。
你这个验证码太万恶了。

发表评论:

Powered by emlog