码迷,mamicode.com
首页 > 其他好文 > 详细

C 编程技巧

时间:2015-07-01 11:39:50      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:

1. /* round up for aligment */

#define round_up(x, aligment) (x) + ((aligment) - 1) ) / (aligment) ) * (aligment) )

round_up(7, 5) = 10

 

2.  负数进行模运算   (-7 % 5 = 3  ->  7 加上 3 就可以被 5 整除)

void *
memcpy (dstpp, srcpp, len)
     void *dstpp;
     const void *srcpp;
     size_t len;
{
  unsigned long int dstp = (long int) dstpp;
  unsigned long int srcp = (long int) srcpp;

  /* Copy from the beginning to the end.  */

  /* If there not too few bytes to copy, use word copy.  */
  if (len >= OP_T_THRES)
    {   
      /* Copy just a few bytes to make DSTP aligned.  */
      len -= (-dstp) % OPSIZ;
      BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ);
...

}

 

3. list_entry 

#define list_entry(ptr, type, member)  (type *) (char *)(ptr) - (unsigned long) &((type *)0)->member ) ) 
从一个结构的成员指针找到其容器的指针
把0强制转化为指针类型,即0是一个地址,为段基址。取以0为结构体基址的结构体的域变量member的地址,那么这个地址就等于member域到结构体基地址的偏移字节数。
 
#define list_entry(ptr, type, member)  \
    container_of(ptr, type, member)
#define container_of(ptr, type, member) ({                              const typeof( ((type *)0)->member ) *__mptr = (ptr);            (type *)( (char *)__mptr - offsetof(type,member) );})
#endif

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

 

4. 获取一个数组的元素个数

#define SIZE_ARRAY(a)  ( sizeof((a)) / sizeof((a[0])) )

 

C 编程技巧

标签:

原文地址:http://www.cnblogs.com/xiaokuang/p/4612669.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!