hacqing

春风扫落叶...

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

    自己很少记录什么, 以下为平时阅读代码看到令自己很有感觉的code, 有其他好的, 会更新。

//1.
typedef struct struct_name
{
  struct struct_name * next;
  ...
  size_t priv_size;
  void * priv_data;
  ...
    char extra[1];
} struct_name;
/* 亮点: 
  1. next字段用于遍历判断结束
  2. 使用priv_data指向私有数据, priv_size指明其大小
  3. extra[1]用于结构体扩展
*/

//2.
do
{
    ...
    if (error)
    {
        log();
        break;
    }
    ...
} while (0);
/*亮点
  1. do { } while (0); 结合break;的使用, 避免出错后用goto fail; 跳转.
*/

//3.
extern void * repeat(size_t size);
#define MALLOC(dst, size) \
  dst = malloc(size);  \
  if (dst == 0)      \
  {             \
    dst = repeat(size);\
  }             \

void * repeat(size_t size)
{
#define repeat(size) 0
  void * ptr = 0;
  MALLOC(ptr, size);
#undef repeat
  return ptr;
}
/*亮点
  1. 进行内存申请, 申请两次失败返回0, 是这个#define.
*/

//4.
typedef struct some_struct
{
  ...
  void * op_fun(void *);
  ...
} some_struct;
void * some_op_fun(void * para)
{
  ...
}

typedef struct xxx_context
{
  ...
  size_t priv_size;
  void * priv_data;
  void * op_fun(void *);
  ...
} xxx_context;
void * context_op_fun(void * para)
{
  return priv_data->op_fun(para);
}

{
  ...
  do 
  {
    xxx_context * ptr_context = (xxx_context *)malloc(sizeof(xxx_context));
    if (ptr_context == 0)
    {
      break;
    }
    memset((char *)ptr_context, 0, sizeof(*ptr_context));
    some_struct * ptr = (some_struct *)malloc(sizeof(some_struct));
    if ( ptr == 0)
    {
      free(ptr_context);       
break;     }     ptr_context->priv_data = ptr;     ptr_context->priv_size = sizeof(*ptr);     ptr_context->op_fun   = context_op_fun;     ptr->op_fun       = some_op_fun;     //call context op_fun     ...   } while (0);   ... } /*亮点   1. 这样就可以做到一个xxx_context对应多个some_struct,   从而使用xxx_context调用op_fun屏蔽some_struct的op_fun,   这种方法在ffmpeg中使用的很多。 */



posted on 2012-04-09 10:40  hacqing  阅读(234)  评论(0编辑  收藏  举报