C语言模拟OO机制的再研究
恶心的GObject[Part I][v0.1]

OOC-Embeded_C语言模拟对象的应用

pingf posted @ Sun, 05 Sep 2010 01:21:10 -1100 in C语言 with tags 创作 , 2561 readers

其实还是在折腾如何用C语言模拟对象的机制,

现在这个版本个人该觉还是不错的,可以用GCC以及KEIL,IAR等附带的编译器来编译

另外还在此基础上实现了常用的数据结构,包括下面这些,

链表[包括单链表,双链表,循环链表],堆栈,队列,集合,

哈希表[包括链式和开放地址式],二差树[普通二叉树,平衡二叉树],

堆/优先队列,图......

项目地址:

http://code.google.com/p/ooc-embeded/

提供win下编译好的DLL,源代码可通过SVN获取

核心代码如下,

/**
 * OOC-Embeded 
 * version : see the log file
 * status  : beta 
 * author  : Jesse Meng 
 * Blog    : http://www.pingf.me 
 * E-mail  : pingf0@gmail.com
 */
#ifndef __JC_OOP__
#define __JC_OOP__
#include <stdio.h>
#include <stdlib.h>
//
#ifdef BUILD_DLL
/* DLL export */
#define EXPORT __declspec(dllexport)
#elif   defined BUILD_WITH_DLL  
/* EXE import */
#define EXPORT __declspec(dllimport)
#else
#define EXPORT
#endif
//
#define USE_HEAP_FOR_CLASS
//
#ifdef USE_CALLOC_FOR_CLASS
#define _CLASS_ALLOC(this,Type) \
this=(struct _##Type *)malloc(sizeof(struct _##Type));  
#else
#define _CLASS_ALLOC(this,Type) \
this=(struct _##Type *)calloc(1,sizeof(struct _##Type));  
#endif 
/////////////////////////////////////////////////////////////
#ifdef USE_HEAP_FOR_CLASS
#define _CLASS(Type) \
typedef struct _##Type Type; \
EXPORT int init##Type(struct _##Type * this,void *param); \
EXPORT int fin##Type(struct _##Type *this,void *param); \
EXPORT struct _##Type * new##Type(void *param); \
EXPORT int del##Type(struct _##Type **this,void *param); \
struct _##Type \
{
//////////////////////////////////////
#define _CTOR(Type) \
EXPORT struct _##Type * new##Type(void *param) \
{ \
	struct _##Type *this; \
	int initRet=0; \
	_CLASS_ALLOC(this,Type); \
	if( NULL==this ) { \
        return NULL; \
    } \
	initRet=init##Type(this,param); \
	if(-1==initRet) { \
        free(this); \
        return NULL; \
    } \
	return this; \
} \
EXPORT int init##Type(struct _##Type * this,void *param) \
{  
//
#define _DTOR(Type) \
EXPORT int del##Type(struct _##Type **this,void *param) \
{ \
	int finRet=0; \
	if(NULL==(this)) { \
        return -1; \
    } \
	finRet=fin##Type(*(this),param); \
	if(-1==finRet) {\
        return -1; \
    } \
	free(*(this)); \
	(*(this))=NULL; \
	return 0; \
} \
EXPORT int fin##Type(struct _##Type *this,void *param) \
{ 
//
#else
#define _CLASS(Type) \
typedef struct _##Type Type; \
EXPORT int init##Type(struct _##Type * this,void *param); \
EXPORT int fin##Type(struct _##Type *this,void *param); \
struct _##Type \
{
//////////////////////////////////////
#define _CTOR(Type) \
EXPORT int init##Type(struct _##Type * this,void *param) \
{  
//
#define _DTOR(Type) \
EXPORT int fin##Type(struct _##Type *this,void *param) \
{ 
//  
#endif 
/////////////////////
#define _END_CLASS };
//
#define _END_CTOR \
	return  0; \
} 
// 
#define _END_DTOR \
return 0; \
}
//
#define _HAVES(Type,name) \
static struct _##Type##S s; \
//
#define _AUTOS(Type,name,sparam) \
do{ \
    init##Type##S(&s,sparam); \
    this->name=&s; \
}while(0);
//
#define _HAVEP(Type) \
static struct _##Type##P *p=NULL; 
//
#define _CASTP(Type) \
do{ \
    p=(struct _##Type##P *)param; \
}while(0);
/////////////////////////////////////////////////////////////
#define CLASS(Type) _CLASS(Type)
#define END_CLASS _END_CLASS 
//
#define CTOR(Type) _CTOR(Type)
#define END_CTOR _END_CTOR
//
#define DTOR(Type) _DTOR(Type)
#define END_DTOR _END_DTOR
//
#define HAVES(Type,name) _HAVES(Type,name)  
//
#define AUTOS(Type,name,sparam) _AUTOS(Type,name,sparam)  
//
#define HAVEP(Type) _HAVEP(Type)  
//
#define CASTP(Type) _CASTP(Type)  
//
#endif



Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter