vak: (Default)
[personal profile] vak
Описанные ниже расширения языка Си позволяют простыми средствами превратить его в объектно-ориентированное средство разработки. При этом достигается совместимость с tagged-типами языка Ада.

1) Описание новых структур как дополнение старых:

   struct foo : bar {
       ...
   };


Поля новой структуры дописываются в хвост к полям старой структуры. Разрешается неявное преобразование указателя на расширенную структуру к указателю на базовую.

2) Описание структур с набором интерфейсных функций:

   struct stream {
       ...
   interface:
      void putch (char c);
      int getch (void);
      int peekch ();
      void flush ();
      int eof ();
   };


В структуре создается скрытое первое поле, указывающее на таблицу указателей на функции:

   struct stream {
      struct {
         void (*putch) ();
         int (*getch) ();
         int (*peekch) ();
         void (*flush) ();
         int (*eof) ();
      } *interface;
      ...
   };


3) При определении интерфейсной функции указывается имя соответствующей структуры. Добавляется скрытый аргумент this:

   void putch (char c) : interface struct stream
   { ... }


превращается в:

   void putch (struct stream *this, char c)
   { ... }


4) Вызов интерфейсной функции:

   stream->putch ('x');

транслируется так:

   stream->interface->putch (stream, 'x');

Дело за малым - нужен энтузиаст, готовый хакнуть GCC. :-)