int oder INT



  • hallo
    kommen alle compiler mit INT (ja grossbuchstaben) klar oder nur die
    windofs-compiler? in meinen büchern hab ich immer nur 'int' gesehen.

    mfg f.-th.



  • Darf normalerweise nicht gehen, auch net unter Windows. Eventuell mach die Winapi ein typedef oder define (wie bei BOOL).

    Guckst du windef.h da steht das alles drin...



  • Was heißt es darf nicht gehen? Es ist halt einfach ein selbst definierter Typ, machen wir hier schliesslich alle tag täglich. 🙄 Schau einfach mal wo INT definiert ist, und das kannst du auch in jedem anderen Compiler übernehmen, wenn es dort fehlt. Die WinAPI macht schliesslich kein Voodoo. 😉



  • Ich meinte es darf nicht gehen ohne das der Typ definiert ist weil da c/c++ genau unterscheidet.



  • hallo
    also ich bin für int(klein).
    bin in einem tutorial drüber gestolpert, wo in einem beispiel viele fehler
    gemeldet wurden, sich der compiler sich aber nicht über INT und LONG
    beschwerte.
    ist in dem beispiel nicht selbstdefiniert, denke aber, dass der ursprung
    in billy's softwareschmiede liegt wegen WORD und DWORD. sucht dies mal
    in eueren c oder c++ büchern. die meisten windofs-compiler mögens.

    ich hab auch schon header-files modifiziert. aber in einem tutorial wie
    stehts da mit mit dem lernerfolg, wenn der z.b. erste quelltext den
    compiler als begrüssung schon mit einer umfangreichen fehlermeldung beglückt.
    na gut eventuell packt mich dann der ergeiz und ich versuch die fehlerliste
    zu schreddern. 😉
    aber müssen bei standarttutorials so umfangreiche fehlermeldungen sein?
    okay bei sonderlösungen kann man's akzeptieren, wenn dies den code extrem
    übersichtlicher macht. dann sollte aber auch der compiler genannt werden.

    mfg f.-th.



  • nachtrag
    frage wegen einiger antworten: dies ist doch ein allgemeines c/c++ forum
    oder ein windows- c/c++ forum? 😉

    mfg f.-th.



  • Also erstmal, das was die Microsofties mit INT, DWORD usw. gemacht haben ist richtig und sogar gut! Sich darüber herab lassend zu äußern ist also fehl am Platz. Denn mit den INT, WORD, DWORD usw. bessert man den fehlenden Standard in C++ aus, das die bit-Größe von int, long usw. nicht definiert ist. D.h. auf einem 64-Bit-System ist INT genauso groß wie auf einem 32-Bit-System. Wenn der Source also mal unter einem anderen System compiliert wird, wo sich die Typen in der Größe ändern, muß man nur einmal kurz die typedefs ändern, und gut ist. 😃

    Anstatt das du überall das INT durch ein int ersetzt, solltest du vielleicht lieber einmal ein

    typedef int INT;
    

    schreiben, wenn es bei dir fehlt.

    Recht hast du aber, das ein Tutorial für C++ schon mit den eingebauten Typen arbeiten sollte. Ein Anfänger kann das schlecht wissen.

    FireFlow schrieb:

    Ich meinte es darf nicht gehen ohne das der Typ definiert ist weil da c/c++ genau unterscheidet.

    OK, du meinstest die Groß-Kleinschreibung wird unterschieden? Das stimmt natürlich. 🙂



  • Das INT typedef wird aber sehr sehr selten genutzt in der WinAPI. Die anderen die du genannt hast werden aber häufig eingesetzt.



  • hallo
    also die meisten c/c++ compiler die für windows geschrieben wurden sollten
    dies ohne typedef können.
    ich hab jetzt nicht nachgesehen wo's unter win32 steht aber bei win16 stand
    die beschreibung in den windows-help-files und nicht in den compiler- spezifischen.
    ich könnt mir aber vorstellen bei einem grösseren projekt INT und int
    und je nach compiler oder typdef unterschiedlich definiert, da kommt freude
    auf. 🙂 😞 oder wie?



  • Normal nimmt das auch kein windows-compiler, so lange du nicht windows.h inkludierst, oder den entsprechenden header der den Typ definiert.

    Und wenn du nen windows-spezifisches Tutorial durchmachst ist es doch klar, dass es windows-spezifischen code hat.



  • b schrieb:

    Das INT typedef wird aber sehr sehr selten genutzt in der WinAPI. Die anderen die du genannt hast werden aber häufig eingesetzt.

    Nun, eigentlich ist INT ja auch ein bisschen sinnlos. int ist nunmal int, egal ob du jetzt ein gross geschriebenes Typ-Alias definierst oder nicht. Es macht keinen Sinn, INT anders zu definieren, zB

    typedef long INT;
    

    Was anderes ist es zB mit WORD, DWORD, INT32 etc.

    Aber um mal auf die ursprüngliche Frage zurückzukommen, Standard Compiler kennen die grossgeschriebenen Typen natürlich nicht. Und auch andere Compiler werden das wohl kaum anbieten, da MS genau festgelegt hat, wo jeder Typ definiert wird. Nachzulesen im MSDN unter "Windows Data Types".



  • wird sich INT nie ändern?????



  • Keine Ahnung, aber die Chancen sind ziemlich gut, dass auch auf zukünftigen Plattformen INT mit

    typedef int INT;
    

    definiert wird.



  • hallo
    also ausser den ms-compilern kommt mindestens der free bcc5.5 mit INT und int
    klar. ich vermute auch die c/c++-compiler von watcom und symantec/digital mars.
    hab die beiden letzten aber noch nicht getestet.
    artchi schrieb ( 2. beitrag) der wertebereich von INT ist bei den ms-compilern
    ist gleich egal ob 16, 32 oder 64 -bit compiler - int ist aber "bit-gebunden".
    wenn das stimmt typedef = noch grösseres chaos. aber wie heisst es nur genies
    beherschen das chaos. 😉

    habe mal vor einiger zeit einen dbase3-headerstruct (geschrieben für 16bit)
    mit sizeof(headergrösse) gecheckt: ergebnis je nach compiler 32 bis 37 byte
    gross! ursache asser int( 16 oder 32 bit) -> char wird eventuell von den
    compilern im selben quelltext unterschiedlich optimiert (8, 16 oder 32 bit) 😞

    einen 64-bit compiler hab ich noch nicht getestet.

    mfg f.-th.



  • f.-th. schrieb:

    also ausser den ms-compilern kommt mindestens der free bcc5.5 mit INT und int
    klar.

    Kann ich nicht bestätigen.

    Undefined symbol 'INT' in function main()

    getestet mit Borland C++ 5.5.1 Compiler

    f.-th. schrieb:

    artchi schrieb ( 2. beitrag) der wertebereich von INT ist bei den ms-compilern
    ist gleich egal ob 16, 32 oder 64 -bit compiler - int ist aber "bit-gebunden".

    Weiss zwar nicht, was du mit "bit-gebunden" meinst, aber INT war schon immer ein int Alias (afaik). Unter DOS (16 Bit) war int auch 16 Bit, unter Win32 und Win64 ist int 32 Bit gross. So gross ist das Chaos also gar nicht. 🙂

    f.-th. schrieb:

    habe mal vor einiger zeit einen dbase3-headerstruct (geschrieben für 16bit)
    mit sizeof(headergrösse) gecheckt: ergebnis je nach compiler 32 bis 37 byte
    gross! ursache asser int( 16 oder 32 bit)

    Für sowas nimmt man eben spezielle typedefs, zB int32. Damit ist sichergestellt, dass unabhängig von Compiler oder Plattform der Typ immer gleich gross ist. Zudem sollte man auf Alignment achten.



  • @groovemaster: ich hab meine c/c++ compiler auf einem anderen rechner.
    deswegen kann ich jetzt nicht meine sub-sub-version (bcc5.5.?) nachsehen
    aber windows-headerfile einbinden und dann INT no errors und no warnings. 🙂
    oder hast du mit deinem bcc5.5 noch keine windows-api-exe erstellt?

    und zur grösse von int 16-bit-umgebung ist klar, 32-bit auch noch aber bei
    64-bit soll es nach den info's aus dem netz so sein das einige compiler
    meinen int sei 32 bit und andere int sei 64 bit.

    und zur dbase3-header-struct: ich wollte weitgehend compiler-unabhängige
    quelltexte erstellen, denn welcher 16-bit-compiler kennt schon int32, da
    eignet sich schon eher short.

    aber das eigentliche problem waren die unterschiedliche interpretation
    von char im selben quelltext mit dem selben compiler(verschiedene hersteller
    zeigten diesen effect). 😞
    aber ich hab's inzwischen nachgelesen char ist mindestens 8bit breit, kann
    z.b. auf 32bit systemen auch 16bit oder 32bit breit sein. jenach position
    im quelltext wird dies von 32bit systemen entsprechend interpretiert. ich
    hab das system noch nicht erkannt. andere getestete compilerschalter brachten
    noch keinen erfolg. vielleicht find ich ja noch die passende kombination.

    mfg f.-th.



  • f.-th. schrieb:

    aber windows-headerfile einbinden und dann INT no errors und no warnings.

    Also unterstützt der Compiler nicht INT, sondern typedef.



  • f.-th. schrieb:

    aber windows-headerfile einbinden und dann INT no errors und no warnings. 🙂

    Compilerunterstützt bedeutet immer nativ, also ohne externe Definitionen. Wenn du irgendwelche Headerdateien einbindest, dann ist klar, dass dem Compiler der Typ dadurch bekannt ist. Das ist bei anderen Compiler naber genauso.

    f.-th. schrieb:

    und zur grösse von int 16-bit-umgebung ist klar, 32-bit auch noch aber bei
    64-bit soll es nach den info's aus dem netz so sein das einige compiler
    meinen int sei 32 bit und andere int sei 64 bit.

    Das könnte vermutlich von Plattform zu Plattform unterschiedlich sein. Mir ist bisher lediglich bekannt, dass sich unter Windows long von 32 Bit auf 64 Bit vergrössert, alle anderen Ganzzahltypen sollen gleich bleiben.

    f.-th. schrieb:

    und zur dbase3-header-struct: ich wollte weitgehend compiler-unabhängige
    quelltexte erstellen, denn welcher 16-bit-compiler kennt schon int32

    Äääähh, so ziemlich jeder DOS Compiler ➡ long.
    Genauso gut könntest du fragen, welcher 32 Bit Compiler schon int64 kennt? Hey ich kenn einen, GCC. Und noch einen, MSC. Oder wie wärs mit dem DMC? Nahezu jeder aktuelle Compiler kennt long long. OK, ist zwar C, aber idR gibt es Optionen, diesen Typ auch in C++ zu nutzen. Mal ganz abgesehen davon, dass einige Compiler noch eigene Typen mitbringen, zB wie __int64 beim MSC. Vielleicht dürfen wir uns in zukünftigen C++ Standards auch auf sowas wie C's <stdint.h> freuen.
    Du siehst, dieser ganze Typendschungel ist ein ziemliches Hick-Hack, aber es geht, wenn man nur will. Und ein int32 für 16 Bit Compiler nachzuschieben ist kein allzu grosses Problem. Wenn long nicht bereits 32 Bit gross ist, dann kann man immer noch zwei int16 nehmen, eines für lo und eines für hi. Du musst halt lediglich entscheiden, was du maximal supporten willst, und dann die Implementation entsprechend darauf ausrichten.

    f.-th. schrieb:

    aber das eigentliche problem waren die unterschiedliche interpretation
    von char im selben quelltext mit dem selben compiler

    Sehr unwahrscheinlich. C++ definiert die Grösse von char zwar nicht exakt, aber zumindest soweit, dass ein char so gross wie ein Byte ist. Und ein Byte sollte auf dem jeweiligen Compiler immer gleich gross sein. Sicherlich kann die Grösse eines Bytes von einem zum anderen Compiler unterschiedlich gross sein, aber immerhin gibt es auch mehr Plattformen als nur Windows oder Linux.
    Wie ich bereits erwähnte, sind solche Beobachtungen oftmals auf Alignment zurückzuführen. Bsp.

    struct foo
    {
        char a;
        int b;
    };
    

    Gehen wir mal von einem 32 Bit System aus, auf dem char 8 Bit und int 32 Bit gross ist. Wider aller Erwartungen ist es möglich, dass hier ein Compiler für sizeof(foo) nicht 5 ausspucken wird. Warum? Nun, zum einen garantiert der Standard dies nicht. Und zum anderen möchte der Compiler evtl., dass für jeden Member höchstmögliche Zugriffsgeschwindigkeit erreicht wird, weil der Benutzer zB eingestellt hat, auf Geschwindigkeit zu optimieren. Für foo.a ist das ja noch kein grosses Problem, da foo.a ein Byte gross ist, und dies die kleinste adressierbare Einheit ist. Bei x86 CPUs ist es zB egal, an welcher Stelle dieses Byte im Speicher liegt, der Zugriff darauf ist immer gleich schnell (mal abgesehen davon, dass Lesezugriffe idR schneller als Schreibzugriffe sind). Bei foo.b ist es schon etwas schwieriger. Ich will jetzt nicht näher auf die Arbeitsweise von Memory-Pipelines in Verbindung mit der CPU eingehen, das würde zu weit führen. Aber x86 CPUs können zB schneller auf einen 32 Bit Wert zugreifen, wenn er auch an einer 32 Bit (4 Byte) Speichergrenze ausgerichtet ist. Der Compiler definiert diese Struktur dann wie folgt

    struct foo
    {
        char a;
        char __dummy[3];
        int b;
    };
    

    Da für die Struktur selbst dann auch mindestens ein 32 Bit Alignment verwendet wird, ist sichergestellt, dass foo.b immer an einer 32 Bit Grenze ausgerichtet ist.
    Dennoch gilt immer, dass sizeof(foo.a) == 1.
    Ich kann also deine Aussage bzgl. "unterschiedliche interpretation von char" nicht wirklich nachvollziehen.

    f.-th. schrieb:

    aber ich hab's inzwischen nachgelesen char ist mindestens 8bit breit, kann
    z.b. auf 32bit systemen auch 16bit oder 32bit breit sein.

    Nun, wie bereits erwähnt, definiert der Standard keine exakten Grössen. Er sagt lediglich Folgendes:

    sizeof liefert die Grösse in Byte
    1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
    


  • grooevmaster! Muß dich leider berichtigen. long wird auf 64bit-System unter Windows weiterhin wie unter Win32 32bit bleiben, das wird sich nicht ändern. Denn da hat sich MS schon lange drauf fest gelegt. long long wird aber 64bit.

    Hier die fundamentalen Typen und weiter unten die von MS:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_fundamental_types.asp

    Data Type Ranges:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_langref_data_type_ranges.asp



  • Artchi schrieb:

    grooevmaster! Muß dich leider berichtigen. long wird auf 64bit-System unter Windows weiterhin wie unter Win32 32bit bleiben, das wird sich nicht ändern. Denn da hat sich MS schon lange drauf fest gelegt.

    Das wäre aber schlecht. Welchen 64 Bit Typ wird es denn dann unter Win64 geben? Immerhin kennt C++ kein long long.


Anmelden zum Antworten