Include-Wächter-Namen



  • Mein eigener Container erwartet als zweites Template-Argument einen Allokator. Und ich implentiere zwei Standard-Allokatoren, new / delete und malloc / free . Es kann ein beliebiger Typ als Allokator an den Container übergeben werden (der die Bestimmungen erfüllt). Der Allokator, welcher malloc und free benutzt, ist natürlich nur benutzbar, wenn der Header <cstdlib> inkludiert wurde (logisch, oder?). Nun könnte ich folgende Schritte unternehmen:

    • Der Allokator ist nur definiert, wenn <cstdlib> bereits inkludiert wurde (meine eigentliche Idee).
    • Der Allokator ist immer definiert, denn <cstdlib> wird im Allokator-Header inkludiert.
    • Der Allokator ist nur definiert, wenn ein bestimmtes Makro definiert ist (z.B. LIB_USE_MALLOC) und dann wird dann ggf <cstdlib> inkludieret.


  • Ich wäre für Variante 2. Alternativ könntest du die Definition des malloc-Allokators auch in einen eigenen Header auslagern (inklusive des #include <cstdlib>), den der Nutzer bei Bedarf einbinden kann.



  • Hör mal das ist eigentlich kein Problem. Die zweite Variante ist üblich!
    Und niemand der deine Lib verwenden wird, hätte wahrscheinlich ein Problem das
    cstdlib eingebunden ist!



  • EOutOfResources schrieb:

    Der Allokator ist nur definiert, wenn <cstdlib> bereits inkludiert wurde (meine eigentliche Idee).

    Schwachsinn.

    Der Allokator ist immer definiert, denn <cstdlib> wird im Allokator-Header inkludiert.

    So macht es jeder.

    Der Allokator ist nur definiert, wenn ein bestimmtes Makro definiert ist (z.B. LIB_USE_MALLOC) und dann wird dann ggf <cstdlib> inkludieret.

    Macht nur sinn wenn ein #include<cstdlib> schwerwiegende folgen haette.
    Sowas macht man, wenn man fuer ein feature zB boost braucht. Dann benutzt man so ein define um das feature zu aktivieren wenn boost vorhanden ist.

    Dazu muss es sich aber schon um etwas richtig fettes handeln, sonst inkludet man einfach.



  • Der dritte Beitrag in diesem Thread ist zu beachten.


  • Mod

    EOutOfResources schrieb:

    Der dritte Beitrag in diesem Thread ist zu beachten.

    😕 Sag doch mal ein paar mehr als ein paar Stichworte. Es ist extrem schwer, mit dir zu kommunizieren.



  • EOutOfResources schrieb:

    Der dritte Beitrag in diesem Thread ist zu beachten.

    Tatsächlich, vielen Dank!

    Frage am Rande: Ich dachte, auf Vector, List usw. könne ich auch zugreifen, wenn ich "stdlib.h" inkludiere statt "vector". Wieso funktioniert das nicht? Was liefert mir stdlib.h denn allein (ohne weitere includes)?

    Ja, in der Tat. Jetzt ist mir alles klar.

    In den ersten 3 Beitraege geht es um namespaces...



  • SeppJ schrieb:

    Sag doch mal ein paar mehr als ein paar Stichworte.

    Der Threadstarter ging davon aus, dass <cstdlib> standardmässig <vector> inkludiert. Wenn ich nun <cstdlib> immer inkludiere, kann auch gedacht werden, dass das Standard ist.



  • EOutOfResources schrieb:

    SeppJ schrieb:

    Sag doch mal ein paar mehr als ein paar Stichworte.

    Der Threadstarter ging davon aus, dass <cstdlib> standardmässig <vector> inkludiert. Wenn ich nun <cstdlib> immer inkludiere, kann auch gedacht werden, dass das Standard ist.

    Selten so einen Bloedsinn gehoert.



  • EOutOfResources schrieb:

    Wenn ich nun <cstdlib> immer inkludiere, kann auch gedacht werden, dass das Standard ist.

    Dass was Standard ist? Kannst du dich nicht genauer ausdrücken? Oder verwirrt mich tatsächlich nur deine Logik?



  • Vergesst es! Meine Frage wurde beantwortet.



  • Ich weiss nicht, das sind doch alles keine Probleme.
    Wenn ich irgendwo <foo.h> inkludifiziere, und dann std::string verwende, und irgendwann geht's nimmer weil <foo.h> geändert wurde, dann schreib' ich halt mein #include <string> dazu, und die Sache ist gegessen.
    Über sowas macht man sich keinen Kopf.

    Stell sicher dass alle deine Header-Files "alleine" inkludiert werden können, und inkludier in Header-Files nicht lauter Unsinn den du nicht brauchst. Um den Rest kümmert sich der Anwender-Programmierer.



  • Nexus schrieb:

    EOutOfResources schrieb:

    Wenn ich nun <cstdlib> immer inkludiere, kann auch gedacht werden, dass das Standard ist.

    Dass was Standard ist? Kannst du dich nicht genauer ausdrücken? Oder verwirrt mich tatsächlich nur deine Logik?

    Dich verwirrt die Logik glaub ich.
    Er denkt, dass wenn er in seinem Header <cstdlib> einbindet, dass dann irgendwelche Leute meinen, das müsste man so machen weil es so im C++ Standard steht.
    Ich weiss ja nicht, wie man von seinem eigenen Code denken kann, andere Leute würden den für Standard halten :D. Wenn ich das denken würde, würde ich sofort aufhören meinen Code zu GoogleCode hochzuladen xD.


Anmelden zum Antworten