一本书, 一段源码, 推荐给大家

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 hunter_gio 的 blog

我要推举的是<c interfaces and implementations: techniques for creating reusable software>, 任何程序都离不开分配内存, 下面一段代码来自随书的负责内存分配的代码:

///////////////mem.h

#ifndef mem_included
#define mem_included
#include "except.h"
extern const except_t mem_failed;
extern void *mem_alloc (long nbytes,
 const char *file, int line);
extern void *mem_calloc(long count, long nbytes,
 const char *file, int line);
extern void mem_free(void *ptr,
 const char *file, int line);
extern void *mem_resize(void *ptr, long nbytes,
 const char *file, int line);
#define alloc(nbytes) \
 mem_alloc((nbytes), __file__, __line__)
#define calloc(count, nbytes) \
 mem_calloc((count), (nbytes), __file__, __line__)
#define  new(p) ((p) = alloc((long)sizeof *(p)))
#define new0(p) ((p) = calloc(1, (long)sizeof *(p)))
#define free(ptr) ((void)(mem_free((ptr), \
 __file__, __line__), (ptr) = 0))
#define resize(ptr, nbytes)  ((ptr) = mem_resize((ptr), \
 (nbytes), __file__, __line__))
#endif

/////////////mem.c

static char rcsid[] = "$id: h:/drh/idioms/book/rcs/mem.doc,v 1.12 1997/10/27 23:08:05 drh exp $";
#include <stdlib.h>
#include <stddef.h>
#include "assert.h"
#include "except.h"
#include "mem.h"
const except_t mem_failed = { "allocation failed" };
void *mem_alloc(long nbytes, const char *file, int line){
 void *ptr;
 assert(nbytes > 0);
 ptr = malloc(nbytes);
 if (ptr == null)
  {
   if (file == null)
    raise(mem_failed);
   else
    except_raise(&mem_failed, file, line);
  }
 return ptr;
}
void *mem_calloc(long count, long nbytes,
 const char *file, int line) {
 void *ptr;
 assert(count > 0);
 assert(nbytes > 0);
 ptr = calloc(count, nbytes);
 if (ptr == null)
  {
   if (file == null)
    raise(mem_failed);
   else
    except_raise(&mem_failed, file, line);
  }
 return ptr;
}
void mem_free(void *ptr, const char *file, int line) {
 if (ptr)
  free(ptr);
}
void *mem_resize(void *ptr, long nbytes,
 const char *file, int line) {
 assert(ptr);
 assert(nbytes > 0);
 ptr = realloc(ptr, nbytes);
 if (ptr == null)
  {
   if (file == null)
    raise(mem_failed);
   else
    except_raise(&mem_failed, file, line);
  }
 return ptr;
}

本文关键:一本书, 一段源码, 推荐给大家
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top