Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Frage zu enum-Grundtypen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
31.07.2006, 11:05 Uhr
Yadgar



High!

Mit meinem Grafikprojekt hat diese Frage erstmal nichts zu tun, sie stellt sich mir anlässlich der "Aupperle"-Lektion, die ich gerade durcharbeite.

Also: in enum-Definitionen wird ja immer durchgehend ein und derselbe Grundtyp verwandt. Wie kann es aber dann sein, dass mein gcc unter Windows bei diesem Aufzählungstyp:


C++:
enum Cons
{
   C1 = 4294967295,
   C2 = -1
};



keine Fehlermeldung ausgibt, obwohl es keinen integralen Typ gibt, der C1 und C2 gleichzeitig enthält und gcc auch, wie ich beim Erhöhen des Wertes von C1 um eine weitere Stelle feststellen konnte, keine implizite Umwandlung nach __int64 oder long long kennt?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog

Dieser Post wurde am 31.07.2006 um 11:05 Uhr von Yadgar editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.07.2006, 11:47 Uhr
(un)wissender
Niveauwart


Tja, kurze Version: enum Grundtypen sind scheisse und nicht standardisiert. C# macht das viel besser und in C++0x wird das wohl so ungefähr übernommen.
Also musst du selber aufpassen, was du von Hand zuweist.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.07.2006, 12:12 Uhr
Yadgar



High!


Zitat von (un)wissender:
C# macht das viel besser und in C++0x wird das wohl so ungefähr übernommen.



Was bitte ist C++0x?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.07.2006, 12:42 Uhr
(un)wissender
Niveauwart


Wofür gibt es google?
C++0x ist der vorläufige Name für den nächsten C++-Standard.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.08.2006, 01:31 Uhr
Hans
Library Walker
(Operator)



Zitat von (un)wissender:
Tja, kurze Version: enum Grundtypen sind scheisse und nicht standardisiert. C# macht das viel besser und in C++0x wird das wohl so ungefähr übernommen.
Also musst du selber aufpassen, was du von Hand zuweist.

Hi,
und die lange Version?
Irgendwie klingt mir diese Kurzfassung wie ein Loblied auf C#, ohne eine genauere Antwort auf die Frage zu geben.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.08.2006, 08:14 Uhr
(un)wissender
Niveauwart


Ups, vernichtende Kritik.

C# erlaubt die Angabe eines Grundtyps in der Form enum myenum : char und man kann die Namen der einzelnen Konstanten ausdrucken. Ansonsten Hans, gibt es immer noch Bücher.
C# hat schon seine Vorteile, aber C++ mag ich lieber. Aber gerade die enums sind eine sehr schwache Seite von C++.
Die meisten C++-Compiler erlauben eine Angabe des enum-Grundtyps als Flag, aber das wars auch schon.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.08.2006, 10:50 Uhr
0xdeadbeef
Gott
(Operator)



Zitat von ISO C++ Standard Absatz 7.6.2:

For an enumeration where e_min is the smallest enumerator and e_max is the largest, the values of the enumer-
ation are the values of the underlying type in the range b_min to b_max , where b_min and b_max are, respectively,
the smallest and largest values of the smallest bit-field that can store e_min and e_max. It is possible to
define an enumeration that has values not defined by any of its enumerators.



Die meisten Compiler expandieren allerdings auf die nächsthöhere Zweierpotenz. Mit dem gcc 4.1 unter Linux z.B. gibt dieses Programm:

C++:
#include <iostream>

enum Cons
{
   C1 = 4294967295UL,
   C2 = -1
};

int main() {
  std::cout << sizeof(Cons) << std::endl;
}


8 aus, die enum wird also auf 64 bit expandiert.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 02.08.2006 um 10:54 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.08.2006, 14:45 Uhr
Yadgar




Zitat von 0xdeadbeef:

8 aus, die enum wird also auf 64 bit expandiert.


...also doch long long bzw. (unter Windoof) __int64!

Bis bald im Khyberspace!

Yadgar

Now guzzling: Amaroy Extra, brutal starker Aldikaffee...
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
03.08.2006, 17:42 Uhr
RHBaum



Aus geschwindigkeitsgruenden nehmen die Compiler doch sowieso den Typ der der datenbusbreite entspricht .... (wenn er denn passt)

Und bitte wer defininiert denn mehr als 4 milliarden werte (32 bit BS) ?
Enums sollten ne vereinfachung von "konstanten ohne Wertsemantik" sein ... also nen enum sollt es volkommen schnuppe sein, was dahinter fuern integer steht ^^ sollt nur sicher sein das das selbe enum (konstante) immer den selben wert hat ^^

Ciao ...

Dieser Post wurde am 03.08.2006 um 17:43 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
04.08.2006, 10:58 Uhr
0xdeadbeef
Gott
(Operator)


Nimm zum Beispiel an, du setzt flags, die kombinierbar sind. Sowas wie

C++:
enum access_flags {
  OTHER_EXEC = 1,
  OTHER_WRITE = 2,
  OTHER_READ = 4,
  OTHER_ALL = OTHER_EXEC | OTHER_WRITE | OTHER_READ,
  GROUP_EXEC = 8,
  GROUP_WRITE = 16,
  GROUP_READ = 32,
  GROUP_ALL = GROUP_EXEC | GROUP_WRITE | GROUP_READ,
  OWNER_EXEC = 64,
  OWNER_WRITE = 128,
  OWNER_READ = 256,
  OWNER_ALL = GROUP_EXEC | GROUP_WRITE | GROUP_READ,
  STICKY = 512
  GROUP_SUID = 1024,
  OWNER_SUID = 2048
};

// ...

access_flags file_rights = OWNER_ALL | GROUP_READ | GROUP_EXEC | OTHER_READ | OTHER_EXEC | OWNER_SUID; // 755 +s


Da biste mit 31 flags am Ende deiner 32 bit, und es kann schon Situationen geben, wo man darüber hinausgeht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: