Je travaille également là-dessus sur la base d'une solution macro. Donc c'est pour les plus courageux, je suppose ;-) Mais c'est déjà assez sympa, et je travaille déjà sur quelques projets en plus. Cela fonctionne de sorte que vous définissiez d'abord un fichier d'en-tête séparé pour chaque classe. Comme ça:
#define CLASS Point
#define BUILD_JSON
#define Point__define \
METHOD(Point,public,int,move_up,(int steps)) \
METHOD(Point,public,void,draw) \
\
VAR(read,int,x,JSON(json_int)) \
VAR(read,int,y,JSON(json_int)) \
Pour implémenter la classe, vous créez un fichier d'en-tête pour elle et un fichier C dans lequel vous implémentez les méthodes:
METHOD(Point,public,void,draw)
{
printf("point at %d,%d\n", self->x, self->y);
}
Dans l'en-tête que vous avez créé pour la classe, vous incluez les autres en-têtes dont vous avez besoin et définissez les types, etc. liés à la classe. Dans l'en-tête de classe et dans le fichier C, vous incluez le fichier de spécification de classe (voir le premier exemple de code) et une macro X. Ces X-macros ( 1 , 2 , 3 etc.) étendront le code aux structures de classe réelles et autres déclarations.
Pour hériter d'une classe, #define SUPER supername
et ajoutersupername__define \
comme première ligne dans la définition de classe. Les deux doivent être là. Il existe également un support JSON, des signaux, des classes abstraites, etc.
Pour créer un objet, utilisez simplement W_NEW(classname, .x=1, .y=2,...)
. L'initialisation est basée sur l'initialisation struct introduite dans C11. Cela fonctionne bien et tout ce qui n'est pas répertorié est mis à zéro.
Pour appeler une méthode, utilisez W_CALL(o,method)(1,2,3)
. Cela ressemble à un appel de fonction d'ordre supérieur, mais ce n'est qu'une macro. Il se développe pour devenir ((o)->klass->method(o,1,2,3))
un très bon hack.
Voir la documentation et le code lui-même .
Puisque le framework a besoin d'un code standard, j'ai écrit un script Perl (wobject) qui fait le travail. Si vous utilisez cela, vous pouvez simplement écrire
class Point
public int move_up(int steps)
public void draw()
read int x
read int y
et il créera le fichier de spécification de classe, l'en-tête de classe et un fichier C, qui inclut Point_impl.c
où vous implémentez la classe. Cela économise beaucoup de travail, si vous avez beaucoup de classes simples mais que tout est toujours en C. wobject est un scanner très simple basé sur des expressions régulières qui est facile à adapter à des besoins spécifiques ou à réécrire à partir de zéro.