Makro zum pointerlöschen, geht nicht!



  • Hallo,

    ich habe grade mal mich bisschen in makros versucht, und hab auch schon ein problem!

    Ich dachte, ich schreibe ein makro, zum löschen von zeigern:

    #define DELETE(*pointer)   \
    {                          \
     delete pointer;           \
     pointer=0;                \
    }
    

    nun bekomm ich

    Fehler in der Makro-Argumentsyntax
    

    kann ich sowas gar nicht machen?

    und noch eine (andere) frage, wofür setzt man makros wirklich sinnvoll ein?

    Wieso machen die c++ code tags das nicht grün?



  • Man setzt in C++ Makros nur noch für plattformabhängige Code-Stücke, Include-Guards, Versionsnummern und Debugging (Asserts), manchmal auch für Metaprogrammierung (ist aber ein Haufen Arbeit) ein. Das was du da tust müsste so aussehen:

    #define DELETE(pointer) \
    { \
        delete pointer; \
        pointer = 0; \
    }
    

    Wie du siehst ist in keinster Weise gewährleistet, dass ein Zeiger übergeben wird, was letztlich zu sehr kryptischen Fehlern führt.

    So schauts in C++ aus:

    template <typename T>
    inline void safe_delete (const T*& pointer)
    {
        delete pointer;
        pointer = 0;
    }
    

    Das ist erstens typsicher, zweitens tut es genau das, was du willst und drittens hat es durch das inline prinzipiell genau den selben Effekt.

    Falls du es zu einer globalen Vorgabe machen willst, dass Zeiger nach delete 0 sind, kannst du auch den operator delete überladen.

    Nimm auf jeden Fall Abstand von Makros, die sind böse!



  • Makroprob schrieb:

    kann ich sowas gar nicht machen?

    Doch, aber in der Definition ist ein * zu viel:
    [cpp]#define DELETE(p) {delete p;p=0;}

    und noch eine (andere) frage, wofür setzt man makros wirklich sinnvoll ein?

    Unter C++ fällt mir nichts sinnvolles ein - da sind templates und inline-Funktionen sicherer. Unter C kann man damit etwas ähnliches wie eine Inline-Funktion erzeugen.

    Wieso machen die c++ code tags das nicht grün?

    Was soll grün gemacht werden? (das Forum färbt Kommentare grün ein)


Anmelden zum Antworten