Também estou trabalhando nisso com base em uma solução macro. Portanto, é apenas para os mais corajosos, eu acho ;-) Mas já é muito bom, e já estou trabalhando em alguns projetos. Funciona para que você defina primeiro um arquivo de cabeçalho separado para cada classe. Como isso:
#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)) \
Para implementar a classe, você cria um arquivo de cabeçalho para ele e um arquivo C em que implementa os métodos:
METHOD(Point,public,void,draw)
{
printf("point at %d,%d\n", self->x, self->y);
}
No cabeçalho que você criou para a classe, você inclui outros cabeçalhos necessários e define tipos etc. relacionados à classe. No cabeçalho da classe e no arquivo C, você inclui o arquivo de especificação da classe (consulte o primeiro exemplo de código) e uma macro X. Essas macros X ( 1 , 2 , 3 etc.) expandirão o código para as estruturas de classe reais e outras declarações.
Para herdar uma classe #define SUPER supername
e adicionar supername__define \
como a primeira linha na definição de classe. Ambos devem estar lá. Também há suporte a JSON, sinais, classes abstratas etc.
Para criar um objeto, basta usar W_NEW(classname, .x=1, .y=2,...)
. A inicialização é baseada na inicialização da estrutura introduzida no C11. Funciona bem e tudo o que não está listado é definido como zero.
Para chamar um método, use W_CALL(o,method)(1,2,3)
. Parece uma chamada de função de ordem superior, mas é apenas uma macro. Ele se expande, o ((o)->klass->method(o,1,2,3))
que é um truque muito bom.
Consulte a documentação e o próprio código .
Como a estrutura precisa de algum código padrão, escrevi um script Perl (wobject) que faz o trabalho. Se você usar isso, basta escrever
class Point
public int move_up(int steps)
public void draw()
read int x
read int y
e criará o arquivo de especificação da classe, o cabeçalho da classe e um arquivo C, que inclui Point_impl.c
onde você implementa a classe. Isso economiza bastante trabalho, se você tiver muitas classes simples, mas ainda assim tudo estiver em C. wobject é um scanner muito simples, baseado em expressões regulares, fácil de se adaptar a necessidades específicas ou de ser reescrito do zero.