1 用sizeof(array)/sizeof(array[0])求取数组的大小
目的:提高代码的可维护性
struct event_processor {
int event;
void (*pfEventProc)(void);
};
struct event_processor g_stProcessors[] = {
{ADD, Add},
{DELETE, Delete}
};
#define EVENTS 2
void event_proc(const int event)
{
int i = EVENTS;
for ( ; i >= 0; i--) {
if (event == g_stProcessors[i].event) {
g_stProcessors[i].pfEventProc();
break;
}
}
}
如果g_stProcessors增加或减少,必须同步修改数组中的元素数量;如果没有正确匹配,要不就是功能缺失,要不就会产生数据异常;以下代码可以自动计算数组中的元素数量,因此代码也就具有更好的可维护性
void event_proc(const int event)
{
int i = sizeof(g_stProcessors)/sizeof(g_stProcessors[0]);
for ( ; i >= 0; i--) {
if (event == g_stProcessors[i].event) {
g_stProcessors[i].pfEventProc();
break;
}
}
}
说明:
一般来说,全局变量都是定义在.c文件中,如果event_proc所在文件和.c文件不在同一个文件中,怎么处理?因为使用extern struct event_processor g_stProcessors[]肯定是不行的,这时可以考虑定义一个全局变量,
int g_iMaxEvents = sizeof(g_stProcessors)/sizeof(g_stProcessors[0]),这样所有其它文件都引用这个全局变量
2 用sizeof(var)而不是sizeof(struct)
目的:提高代码的可维护性
struct event_processor stProc, *pstProc;
sizeof(struct event_processor) = sizeof(stProc) = sizeof(*pstProc)
sizeof(pstProc) = sizeof(&stProc)
代码中memset(&stProc, 0, sizeof(struct event_processor))和memset(&stProc, 0, sizeof(stProc))产生的效果是相同的,但用sizeof(var)有更好的可维护性,因为sizeof(var)对变量有强制的同步要求 – 写代码的时候总是会有copy-paste行为,当memset从一个函数copy到另一个函数,如果忘了修改size(var)一般总是会产生编译错误,而sizeof(struct)不会
3 用list_entry根据某个结构的成员获取结构体的首地址
目的:提高代码的可维护性
list_entry(ptr, type, member) /
((type*)((char*)(ptr) - (unsigned long)(&((type*)0)->member)))
这是linux中的一个宏定义,具体可以参见相关资料
4 用三目运算符代替if/else
目的:减少代码长度和不必要的冗余
/* i = max(a, b) */
if (a >= b) {
i = a;
} else {
i = b;
}
代码较长,而且含义不够直白
#define max(a, b) (((a) > (b))?(a):(b))
i = max(a, b)
5 用for代替while
目的:for语句更加紧凑,而且出错的可能小
i = 0;
while (i < 10) {
if (0 == a[i].bFlag) {
i++; /* 易丢失 */
continue;
}
/* do something */
i++;
};
下面的for语句是等价的
for (i = 0; i < 10; i++) {
if (0 == a[i].bFlag) {
continue;
}
/* do something */
}