Wrapper für Funktion aus der Standardbibliothek



  • Hallo,
    ich möchte gerne in meinem Code eine Funktion benutzen, die "remove" heißen soll. Blöderweise ist in der stdio-Bibliothek auch schon eine Funktion, die remove heißt. Ist es möglich, dass ich meine remove Methode anstatt die aus der Standardbibliothek benutzen kann? Geht das vielleicht mit einem Wrapper, den ich in meine Header-Datei eintragen kann. Wenn ja, wie?



  • nein, das geht in C nicht.

    Anders als in C++ werden in C die Funktionsnamen nicht abhängig von ihren Paramatern "gemanglet".
    C++ macht das, weil es explizit das überladen von Funktionen unterstützt und so der Linker nicht durcheinander kommt, wenn er zwei Funktionen sieht, die sich lediglich in den Paramatern unterscheiden.

    In C sehen für den Linker allerdings beide remove-Funktionen genau gleich aus.
    Die einzige Lösung wäre also, nicht gegen die Standardbibliothek zu linken, was in den meisten Fällen unsinnig sein sollte.

    Also nenn einfach deine Funktion anders und akzeptiere, dass es schon eine Funktion namens remove gibt.



  • Das einzige, was mir einfällt ist ein nicht zu empfehlender Hack.

    // x.h
    #include <stdio.h>
    inline void std_remove (const char* filename);
    #undef  remove
    #define remove my_remove
    
    void remove (struct tree *x, struct node *y);
    
    // x.c
    #include <stdio.h>
    void std_remove (const char *filename) { remove (filename); }
    
    #include "x.h"
    void remove (struct tree *x, struct node *y)
    {
      // ...
      std_remove("/tmp/tag");
    }
    

    Daher würde ich dir nahelegen, auch in C namespaces zu verwenden und wie die GLib das macht deine Funktion halt "mrx_tree_remove" oder ähnlich benennen.
    So vermeidest du die zweideutigkeiten und macht überdies klarer, was die Funktion eigentlich tut.


Log in to reply