Betriebssystemerkennung durch Präprozessor (Split aus Dynamische Speicherallokation)



  • In einem Bezeichner sind nur Buchstaben, Ziffern (nicht am Anfang) und der Unterstrich erlaubt - also mußt du dich auf diese Zeichen beschränken und die Werte z.B. Kuhnix_BSE und Hasta_La_Vista nennen.



  • Ja aber wie soll mein Programm erkennen welche Option ich nutze wenn ich da freie Wahl beim Namen habe. Da müsste es doch festgelegte Namen wie WIN32 geben oder ?
    Weil so öffnet sich der cmd-editor zwar, aber er gibt nichts aus



  • Bezeichner wie "WINVER" hat sich auch jemand ausgedacht - genauso mußt du auch selber festlegen, welche Makros deine erfundenen Betriebssysteme setzen werden. (und auch ein Compiler für Kuhnix BSE kann sich nicht über die C++ Namensregeln hinwegsetzen)



  • Zwei Dinge:

    1. du solltest du für jedes Problem einen neuen Thread aufmachen, statt Probleme und Fragen, die mit dem eigentlichen Thema nichts zu tun haben im gleichen Thread zu posten. Das Problem hier hat so mal gar nichts mit dynamischer Speicherallokation zu tun.

    2. wie man Syntaxcoloring/Code Formatting benutzt hat man dir ja schon erklärt. Dann tu´s bitte auch, denn unformatierter Code lässt sich schwer lesen -> Leute möchten sich wenig Arbeit machen und lesen´s auch nicht -> weniger Antworten -> möglicherweise keine Lösung

    Ansonsten hat CStoll eigentlich schon alles gesagt, was es zu dem Thema zu sagen gibt 👍



  • @CStoll:

    Makros ? Was heißt das in dem Zusammenhang ? 😕
    Wie soll ich dann eig auch eine Ausgabe bekommen, da ja nichts für Windows festgelegt wurde, sondern nur für die "erfundenen Betriebssysteme ?

    @DocShoe: Ok sorry hatte nicht drangedacht :-/.
    Werde ich beim nächsten Problem machen. 🙂



  • silent12 schrieb:

    @CStoll:

    Makros ? Was heißt das in dem Zusammenhang ? 😕
    Wie soll ich dann eig auch eine Ausgabe bekommen, da ja nichts für Windows festgelegt wurde, sondern nur für die "erfundenen Betriebssysteme ?

    Was der Präprozessor mit #if defined(...) überprüft, ist "nur" die Existenz eines Präprozessor-Makros. Das kann am Anfang des Quelltexts per #define passieren, per Compiler-Option "-DKuhnix_BSE" oder implizit durch den Compiler selbst.



  • Aber warum wird deshalb gar nichts ausgegeben ?


  • Mod

    silent12 schrieb:

    Aber warum wird deshalb gar nichts ausgegeben ?

    Nachdem der Präprozessor mit deinem Code durch ist, bleibt dies übrig:

    // [Inhalt von iostreasm]
    using namespace std;
    int main()
    {
    system("Pause");
    }
    

    Da weder __KuhnixBSE __ noch __HastaLaVista__ noch sonst einer der Bezeichner gesetzt wurden, ist alles was in einem #if defined Block stand gestrichen worden.



  • Achso, das heißt dass ich es nur ausgeben kann wenn ich es mit zB dem Datentyp int für Windows64bit schreibe oder ? Und was ist die von C++ definierte Abkürzung dafür ?


  • Mod

    silent12 schrieb:

    Achso, das heißt dass ich es nur ausgeben kann wenn ich es mit zB dem Datentyp int für Windows64bit schreibe oder ? Und was ist die von C++ definierte Abkürzung dafür ?

    😕 Sind dir die Grundprinzipien des Präprozessors vertraut? Ich habe den Eindruck, dir wurde 5x die gleiche richtige Antwort gegeben, die du aber einfach nicht verstehst.



  • So wie ich das verstehe wird erst geprüft welches Betriebssystem vorliegt und dann wird nur der Quellcode der in dem zugehörigen Absatz folgt an den Compiler weitergegeben, damit nicht unnötiger Quellcode compiliert wird.
    Und in meinem Fall wird alles gelöscht da keins der Betriebssysteme vorliegt und deshalb alles in den Absätzen danach nicht compiliert wird.
    Und deshalb wollte ich wissen wie die Abkürzung für Windows heißt. WIN32 ? oder ist das nur für Windows 32bit Systeme.


  • Mod

    silent12 schrieb:

    So wie ich das verstehe wird erst geprüft welches Betriebssystem vorliegt und dann wird nur der Quellcode der in dem zugehörigen Absatz folgt an den Compiler weitergegeben, damit nicht unnötiger Quellcode compiliert wird.
    Und in meinem Fall wird alles gelöscht da keins der Betriebssysteme vorliegt und deshalb alles in den Absätzen danach nicht compiliert wird.
    Und deshalb wollte ich wissen wie die Abkürzung für Windows heißt. WIN32 ? oder ist das nur für Windows 32bit Systeme.

    Das ist prinzipiell das was hier passiert. Aber nimm das nicht zu wörtlich, dass geprüft wird, welches Betriebssystem vorliegt. Es wird tatsächlich nur geprüft, ob ein Makro mit diesem Namen definiert ist. Viele Compiler setzen diese Makros in Abhängigkeit des Zielsystems. Leider ist nicht fest definiert, wie diese Makrobezeichenr lauten, aber wenn du keinen zu exotischen Compiler hast, dann lautet der Name _WIN32 .



  • Ah ok danke.



  • ... und als kleinen Präprozessortest, kannst du dir ja mal überlegen, was folgender Code so macht:

    #define TRUE  '/'/'/'
    #define FALSE '-'-'-'
    

Anmelden zum Antworten