C语言的习惯和技巧(idiom)

C语言算法中的数学参数放在哪里?

程序运行过程中始终不变的数学常量称为参数,做算法的代码会有特别多的参数,要怎么放置这些参数呢?

  1. 直接在调用的地方用数字常量表示,例如
    x = 0.01 *y;
    这种方式被称为magic number, 不太好。 第一,不好理解,如果只有一个number,还勉强可以注释,如果一行代码有多个number,就真的不好注释了。 第二,如果这个参数在很多地方用到,参数变动的时候,需要多处修改,非常容易有漏网之鱼。
  2. 直接用宏来define数字,在调用的地方使用宏。
    #define SLAM_PARA_XXXX 0.01
    这种方式比直接用数字要好,define单个数字是没问题的,但是在定义数组型参数的时候就不太方便了,例如
    float para_xxx[2][3] = {{1.0000, 2.0000, 3.0000},
    {4.0000, 5.0000, 6.0000}};
    一个很勉强的方式就是把宏定义成花括号里的内容,然后就在调用的地方新建一个变量=宏,但是这样很怪。。。 而且如果这个参数表很大的话,例如10x10的静态查找表,每次调用的地方新建变量并赋值一次会有很多额外消耗。
  3. 用全局变量直接定义 这种方式算是一种比较整洁的解决方案,但是全局变量用多了之后,会一定程度降低代码的可读性。

综合来说编译期参数没有特别完美的存放方案,标清楚全局变量后,(例如用g_前缀)全局变量的方案算是最好的。

【扩展】这时候体现了C++的强大的地方了,C++可以直接在类中定义常量,算是完美解决方案。

全局变量用处

全局变量是被提倡尽量少用的,因为全局变量几乎没有作用于限制,代码阅读者无法很快知道该变量生命周期里发生了什么事件,从而无法很快理解代码的逻辑。

但是这并不意味着全局变量完全没有用处,它至少有以下几点用处,注意使用的时候加上“g_”前缀:

  1. 静态表格常量
  2. 调试系统

程序的参数往往使用静态常量表格来存储,具体原因参见 C语言算法中的数学参数放在哪里?

调试系统是反封装的,(想象一个实验机器插满了各种调试线路、管道),调试系统往往需要获取某些很深的函数内部的某些中间变量,如果通过传参获取,那么 (1)函数参数就会很多,很破坏阅读,一个函数10个参数,其中8个是调试参数 (2)调试系统需要查看的变量集可能会经常变化,层层递归修改函数形参会耗费大量时间。

万不得已修改第三方代码怎么注释?

这种情况通常出现在两个第三方库之间有命名冲突,例如都存在某一些数学函数。 注释方法:

// Hacked by somebody
// End of Hacking

用“hack”这个词非常好,既能够表达出这是对原有模块的破坏,一眼就能看出hack了那些地方,原来是什么代码,另外也很容易搜索。