C 语言面向对象宏实现
头文件
#include <stdio.h>
#include <stddef.h>
#define bool int
#define Bool bool
#define BOOL bool
#define BOOLEAN bool
#define true (1)
#define True (1)
#define TRUE (1)
#define false (0)
#define False (0)
#define FALSE (0)
#define OFFSETOF offsetof
#define IMPLEMENTS(_CLASS_) struct _CLASS_ _CLASS_;
#define EXTENDS(_CLASS_) struct _CLASS_ *_CLASS_;
#define IMPLEMENTS_WITH_NAME(_CLASS_, _NAME_) struct _CLASS_ _NAME_;
#define EXTENDS_WITH_NAME(_CLASS_, _NAME_) struct _CLASS_ *_NAME_;
/* declare and define an interface */
#define INTERFACE(_CLASS_)          \
    typedef struct _CLASS_ _CLASS_; \
    struct _CLASS_
/* declare and define an class */
#define CLASS(_CLASS_)                  \
    typedef struct _CLASS_ _CLASS_;     \
    void _CLASS_##_ctor(_CLASS_ *this); \
    bool _CLASS_##_dtor(_CLASS_ *this); \
    const _CLASS_ *malloc_##_CLASS_();  \
    void free_##_CLASS_(_CLASS_ *this); \
    struct _CLASS_
/* initial an class without finalizers */
#define INIT_CLASS(_CLASS_)                                      \
    const _CLASS_ *malloc_##_CLASS_()                            \
    {                                                            \
        struct _CLASS_ *this;                                    \
        this = (struct _CLASS_ *)malloc(sizeof(struct _CLASS_)); \
        if (!this)                                               \
        {                                                        \
            return 0;                                            \
        }                                                        \
        _CLASS_##_ctor(this);                                    \
        return this;                                             \
    };                                                           \
    void free_##_CLASS_(_CLASS_ *this)                           \
    {                                                            \
        if (_CLASS_##_dtor(this))                                \
        {                                                        \
            free(this);                                          \
        }                                                        \
    }                                                            \
    bool _CLASS_##_dtor(_CLASS_ *this) { return true; }          \
    void _CLASS_##_ctor(_CLASS_ *this)
/* initial an class with malloc method and define constructors */
#define INIT_CTOR_CLASS(_CLASS_)                                 \
    const _CLASS_ *malloc_##_CLASS_()                            \
    {                                                            \
        struct _CLASS_ *this;                                    \
        this = (struct _CLASS_ *)malloc(sizeof(struct _CLASS_)); \
        if (!this)                                               \
        {                                                        \
            return 0;                                            \
        }                                                        \
        _CLASS_##_ctor(this);                                    \
        return this;                                             \
    };                                                           \
    void _CLASS_##_ctor(_CLASS_ *this)
/* initial an class with free method and define finalizers */
#define INIT_DTOR_CLASS(_CLASS_)       \
    void free_##_CLASS_(_CLASS_ *this) \
    {                                  \
        if (_CLASS_##_dtor(this))      \
        {                              \
            free(this);                \
        }                              \
    }                                  \
    bool _CLASS_##_dtor(_CLASS_ *this)
/* build an name of method for class */
#define DEFINE_CLASS_FUNCTION(_CLASS_, _NAME_) _CLASS_##_##_NAME_
/* to set properties for constructors or finalizers */
#define SET(_NAME_, _VALUE_) this->_NAME_ = _VALUE_;
/* get an ptr of member in an object class */
#define MEMBER_PTR(_CLASS_, _MEMBER_) ((_MEMBER_ *)(&(_CLASS_->##_MEMBER_)))
/* from member ptr get son class ptr, warnning: the member cannot an ptr member */
#define FROM_MEMBER_PTR(_CLASS_, _MEMBER_, _MEMBER_PTR_) ((_CLASS_ *)((char *)_MEMBER_PTR_ - OFFSETOF(_CLASS_, _MEMBER_)))
#define MEMBER_FIELD(_CLASS_, _MEMBER_, _FIELD_) _CLASS_->_MEMBER._FIELD_
#define DEFINE_CLASS_FN DEFINE_CLASS_FUNCTION
#define DEFINE_CLASS_FUNC DEFINE_CLASS_FUNCTION
#define CLASS_FUNCTION DEFINE_CLASS_FUNCTION
#define CLASS_FN DEFINE_CLASS_FUNCTION
#define CLASS_FUNC DEFINE_CLASS_FUNCTION```
使用 Demo
#include "cs.h"
INTERFACE(animal)
{
    char *name;
    void (*say)();
};
CLASS(dog)
{
    IMPLEMENTS(animal);
    void (*run)();
};
void CLASS_FUNC(dog, say)();
void CLASS_FUNC(dog, run)();
CLASS(mov)
{
    void (*move)();
    int speed;
};
CLASS(cat)
{
    IMPLEMENTS(animal);
    void (*pa)();
    IMPLEMENTS_WITH_NAME(mov, moves);
};
void CLASS_FUNC(cat, pa)();
void CLASS_FUNC(mov, move)();
INIT_CLASS(dog)
{
    SET(animal.name, "dog");
    this->animal.say = CLASS_FUNC(dog, say);
    this->run = CLASS_FUNC(dog, run);
}
void CLASS_FUNC(dog, say)()
{
    printf("dog say.\n");
}
void CLASS_FUNC(dog, run)()
{
    printf("dog run.\n");
}
void CLASS_FUNC(mov, move)()
{
    printf("mov is moveing.\n");
}
void CLASS_FUNC(cat, pa)()
{
    printf("cat is pa.\n");
}
INIT_CLASS(mov)
{
    this->move = CLASS_FUNC(mov, move);
}
INIT_CLASS(cat)
{
    this->animal.name = "cat";
    this->animal.say = CLASS_FUNC(dog, say);
    this->pa = CLASS_FUNC(cat, pa);
    this->moves.move = CLASS_FUNC(mov, move);
    this->moves.speed = 100;
}
int main(int argc, char *argv[])
{
    cat *_cat = malloc_cat();
    _cat->animal.say();
    _cat->pa();
    _cat->moves.move();
    mov *_mov = (&_cat->moves);
    _mov->move();
    int offset = OFFSETOF(cat, moves);
    cat *cat1 = FROM_MEMBER_PTR(cat, moves, _mov);
    cat1->animal.say();
    cat1->pa();
    cat1->moves.move();
    return 1;
}

                
            
        
浙公网安备 33010602011771号