Objektorientierte C-Programme, Preprocessor



  • Hallo!

    Habe ein etwas spezielles Anliegen und hoffe, dass einer von euch vielleicht eine Lösung/einen Lösungshinweis dazu hat.

    Man kann auch in C objektorientiert programmieren (ja, in C++ wärs einfacher, aber das ist hier leider keine Option). Leider bietet C diese Funktionalität nicht von Haus aus an, daher muss man sich das Ganze selbst zusammenbauen (Beispiel für Interessierte: unten).

    Damit ich das nicht für jedes Programm von Hand machen muss, will ich ein Perlprogramm haben, dass die entsprechenden C-Sourcefiles als Argument geliefert bekommt und die 'Übersetzung' des Pseudo-Objektorientierten-Codes in echten C-Code übernimmt.

    Weiß einer von euch, ob es sowas schon irgendwo gibt? Oder muss ich es selbst schreiben?

    Jedwege Hilfe willkommen...

    Erweiterte OO-Funktionalität wie Vererbung usw. ist nicht notwendig.

    MfG,
    thewolf

    -------
    Codebeispiel in C:

    Main:

    int main( void )
    {
       testklasse* t;
    
       t = S0testklasseOBJC();
    
       t->setI( t, 12 );
       t->getI( t );
    
       return 0;
    }
    

    Pseudo-Code, der von Hand geschrieben und per Perlprogramm übersetzt werden soll:

    CLASS testklasse {
       PRIVATE:
          int i;
    
       PUBLIC:
          void setI( int i );
          int getI();
    
          testklasse();
    };
    
    void testklasse::setI( int i )
    {
       THIS->i = i;
    } 
    
    int testklasse::getI()
    {
       return THIS->i;
    }
    
    testklasse::testklasse()
    {
       THIS->i = 0;
    }
    

    So soll die Implementierung in echtem C aussehen, nachdem das Perlprogramm preprocessed hat:

    typedef struct OBJCtestklasse testklasse;
    
    struct sOBJCtestklasse {
       int i;
       void ( *setI )( testklasse*, int );
       int  ( *getI )( testklasse* );
    }; 
    
    void setI( testklasse* THIS, int i )
    { 
       THIS->i = i;
    }
    
    int getI( testklasse* THIS )
    {
       return THIS->i;
    }
    
    testklasse* S0testklasseOBJC()
    {
       testklasse* THIS = ( testklasse* )malloc( sizeof( sOBJCtestklasse ) );
       if( !THIS )
          return THIS;
       this->setI = setI;
       this->getI = getI;
    
       THIS->i = 0;
    
       return THIS;
    }
    

Anmelden zum Antworten