编码规范很重要,其实他直接影响到了代码迭代更新的效率和出问题的概率。以下为本人对网上广为流传的华为编码规范的个人总结。(ps:其中有几个原则实在是精辟的不能再精辟了,当然也有一些存在疑惑,还希望各位大佬不吝赐教)
高技巧语句不等于高效率的程序,实际上程序的效率关键在于算法。这可能是很多初学者最容易犯得错误。
公共变量是增大模块间耦合的原因之一。全局变量虽然好用,但是宜少不宜多这样能保证数据的安全性。
有必要最好做一下,因为万一出了问题是不好检测出来的。
还是前面讲到的数据安全性问题,可以通过静态函数实现,且整个系统都要保持一致
示例:如下结构中的位域排列,将占较大空间,可读性也稍差。
typedef struct EXAMPLE_STRU
{
unsigned int valid: 1;
PERSON person;
unsigned int set_flg: 1;
} EXAMPLE;
若改成如下形式,不仅可节省 1 字节空间,可读性也变好了。
typedef struct EXAMPLE_STRU
{
unsigned int valid: 1;
unsigned int set_flg: 1;
PERSON person ;
} EXAMPLE;
Linux系统里好像是不允许有空函数的
将函数的参数作为工作变量, 有可能错误地改变参数内容, 所以很危险。 对必须改
变的参数,最好先用局部变量代之,最后再将该局部变量的内容赋给该参数。
示例:下函数的实现不太好。
void sum_data( unsigned int num, int *data, int *sum )
{
unsigned int count;
*sum = 0;
for (count = 0; count < num; count++)
{
*sum += data[count]; // sum 成了工作变量,不太好。
}
}
若改为如下,则更好些。
void sum_data( unsigned int num, int *data, int *sum )
{
unsigned int count ;
int sum_temp;
sum_temp = 0;
for (count = 0; count < num; count ++)
{
sum_temp += data[count];
}
*sum = sum_temp;
}
目的减少函数间接口的复杂度,参数多的话可以通过结构体实现
避免函数功能不明确,给调试带来麻烦
示例:如下函数构造不太合理。
int add_sub( int a, int b, unsigned char add_sub_flg )
{
if (add_sub_flg == INTEGER_ADD)
{
return (a + b);
}
else
{
return (a ٛ b);
}
}
不如分为如下两个函数清晰。
int add( int a, int b )
{
return (a + b);
}
int sub( int a, int b )
{
return (a ٛ b);
}
功能不明确较小的函数,特别是仅有一个上级函数调用它时, 应考虑把它合并到上级
函数中, 而不必单独存在
函数较合理的扇出(调度函数除外) 通常是 3-5.较良好的软件结构通常是顶层函数的扇出较高, 中层函数的扇出较少, 而底层函数则扇入到公共模块中。还是强调函数的高复用性和可读性
TURE/FALSE 的含义是非常模糊的,这点确实有点惊讶,对于那些内存要求不是很苛刻的能不用就不用吧
也可以定义一个局部变量,在用之前对局部变量赋值
行号和文件名可以用宏__LINE__和__FILE__实现
断言可以对在系统中隐藏很深, 用其它手段极难发现的问题进行定位
示例:下面是 C 语言中的一个断言,用宏来设计的。(其中 NULL 为 0L)
#ifdef _EXAM_ASSERT_TEST_ // 若使用断言测试
void exam_assert( char * file_name, unsigned int line_no )
{
printf( "\n[EXAM]Assert failed: %s, line %u\n",
file_name, line_no );
abort( );
}
#define EXAM_ASSERT( condition )
if (condition) // 若条件成立,则无动作
NULL;
else // 否则报告
exam_assert( __FILE__, __LINE__ )
#else // 若不使用断言测试
#define EXAM_ASSERT(condition) NULL
#endif /* end of ASSERT */
笔者确实踩过这样的坑,并且真的很难发现是什么问题。另外循环嵌套尽量不要超过三层且不要太复杂。
浮点运算除法要占用较多 CPU 资源。应为一般的cpu只有硬件乘法器
分配的内存不释放以及文件句柄不关闭, 是较常见的错误, 而且稍不注意就有可能发生。这类错误往往会引起很严重后果,且难以定位
示例:如下程序将造成变量下溢。
unsigned char size ;
while (size-- >= 0) // 将出现下溢
{
... // program code
}
示例:
#pragma warn -rvl // 关闭告警
int examples_fun( void )
{
// 程序,但无 return 语句。
}
#pragma warn +rvl // 打开告警
用过其中一个,效果不理想可能是不会用吧
最精辟的原则之一,可很多人就是通过“试”
最精辟的原则之一,对于提高能力有很大帮助