自己很少记录什么, 以下为平时阅读代码看到令自己很有感觉的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中使用的很多。 */