c语言中的几个小技巧

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 */

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值