Typ einer Variable zur Laufzeit bestimmen



  • Hallo,

    ist es irgendwie möglich zur Laufzeit an den Typ einer Variable zu kommen? Benötige das für Generische Funktionen, die ich mit dem Makroprozessor erstellt habe. Hab folgendes probiert, aber das nimmt der Compiler nicht an:

    int i = 0;
    if (typeof(i) == typeof(int)) // mach was
    


  • an welcher Stelle im Code brauchst du sowas?



  • Antoras schrieb:

    Hallo,
    ist es irgendwie möglich zur Laufzeit an den Typ einer Variable zu kommen?

    In ANSI-C nicht.
    In C++ ja, suche mal nach RTTI.



  • Nein, sowas geht nicht. Es gibt kein "typeof", zumindest nicht in Standard-C.

    Was genau hast du denn vor? Eventuell könntest du den Typ dem Makro übergeben, oder auch ein Makro schreiben, das für einen beliebigen Typ eine entrechende Funktion definiert.



  • Ich hab schon versucht den Typ einem Makro zu übergeben, das Problem ist nur, dass das Makro je nach übergebenem Typ etwas anders machen soll.
    Ich brauch das bei der Implementierung von generischen Listen. Solange ich mit Primitiven arbeite funktioniert das auch problemlos, aber sobald ich die Liste Strings aufnehmen lassen möchte bekomme ich Probleme, da ich dann mit Pointern arbeiten muss. Hab dazu schon gestern einen Thread erstellt: http://www.c-plusplus.net/forum/viewtopic-var-t-is-268264.html

    Ein Problem tritt beispielsweise auf wenn ich die übergebenen Daten in die Liste einfügen möchte. Strings muss ich dazu mit strcpy() kopieren, aber das darf ich eben nur bei Strings machen und nicht bei Primitiven.

    Genau genommen ist eine Überprüfung zur Laufzeit sowieso schlecht, das sollte wenn möglich bei der Kompilierung erledigt werden. Aber da ich keine Makros in Makros definieren kann, mit denen es möglich wäre zur Kompilierzeit den Typ zu prüfen wollte ich das eben zur Laufzeit machen, was aber jetzt ja auch nicht hinhaut...



  • Antoras schrieb:

    Ich brauch das bei der Implementierung von generischen Listen.

    Willkommen in der Welt von C.



  • Antoras schrieb:

    Ich hab schon versucht den Typ einem Makro zu übergeben, das Problem ist nur, dass das Makro je nach übergebenem Typ etwas anders machen soll.

    Übergib doch das "etwas anders" auch als Parameter an das Makro. Dein _LIST_ADD Makro würde dann also nicht nur einen Typ bekommen, sondern auch ein Codestück das an der richtigen Stelle eingefügt wird, d.h. im String-Fall den strcpy-Aufruf.



  • Antoras schrieb:

    Ich brauch das bei der Implementierung von generischen Listen.

    Wenn du keine Angst vor wilder Zeigerarithmetik hast, wäre vielleicht ein Ansatz ähnlich diesem nützlich.



  • namespace invader schrieb:

    Übergib doch das "etwas anders" auch als Parameter an das Makro.

    Das Problem an dieser Lösung ist, dass dann derjenige der die Liste einsetzt dann wissen muss wie diese funktioniert. Das wäre nicht weiter schlimm solange ich der einzige bin, der die Liste einsetzt, mir ist es aber zu aufwendig jedes Mal irgendwelche Parameter an die Liste zu übergeben.

    YASC schrieb:

    Wenn du keine Angst vor wilder Zeigerarithmetik hast, wäre vielleicht ein Ansatz ähnlich diesem nützlich.

    Ich hab mir den Code mal angeguckt. Ich hab noch nicht alles verstanden hab und mir fehlen da auch noch ein paar Funktionen, aber dennoch ist der Code schlichtweg genial. Damit kann ich weiterarbeiten. Vielen Dank dafür!


Anmelden zum Antworten