enum einträge per define
-
Hallo,
ich hätte folgendes Anleigen:
Ist es möglich einen enum typ per define zu erweitern?
nähere Beschreibung:#define MAX_FLAGS 10; typedef enum { eFlag1 =0, eFlag2, eFlag3, ... eFlag10 } T_eTest1;
ist sowas generell möglich? Macht das Sinn oder gibt es bessere Möglichkeiten?
Vielen Dank.
wschleifer
-
Wofür genau würdest du das gerne verwenden wollen!?
-
wschleifer schrieb:
ist sowas generell möglich?
Mit ausreichend Präprozessormagie: Ja. Und wenn ich von Magie rede, dann meine ich damit Fleißarbeit, hunderte von Makros für alle möglichen Fälle zu schreiben (oder automatisch generieren zu lassen). Ein Glück gibt's Leute, die so etwas schon einmal gemacht haben und du darfst es benutzen. Guck mal:
http://www.boost.org/doc/libs/1_55_0/libs/preprocessor/doc/index.html
(Boost ist zwar eine Bibliothekssammlung für C++, aber da der Präprozessor in C und C++ weitgehend gleich ist, sollte das auch für C funktionieren)
Hier sollte es ungefähr so gehen:#include <boost/preprocessor/repetition/enum.hpp> #include <boost/preprocessor/slot/slot.hpp> #define MAX_VALUE 10 #define BOOST_PP_VALUE MAX_VALUE #include BOOST_PP_ASSIGN_SLOT(1) #define TEXT(z, n, text) text##n typedef enum { BOOST_PP_ENUM(BOOST_PP_SLOT(1), TEXT, eFlag) } T_eTest1;
Das ist noch beliebig verkomplizierbar, wenn du Sonderwünsche hast. Zum Beispiel kann man mit einem passenden IF erreichen, dass dein =0 beim ersten Eintrag erscheint (was aber sowieso unnötig ist, da der erste Eintrag immer 0 ist, wenn man nichts anderes angibt).
Macht das Sinn oder gibt es bessere Möglichkeiten?
Kommt drauf an. Wozu soll das denn gut sein, was möchtest du erreichen? Mir kommt das Vorhaben jedenfalls komisch vor.
-
enum und define zu mischen ist generell eine schlechte Idee.
Wenn sich Konstanten als int darstellen lassen, dann IMMER enum.
Die Gründe dafür sind naheliegend.
-
[quote="wschleifer"]ist sowas generell möglich?[/quote…]
Jo.wschleifer schrieb:
Macht das Sinn
Nee. Also goto verwende ich schoin selten. Aber makros um enums zu basteln noch nie. Ich vermute, Du findest geeignete echte Programmioerung, die Dein Problem besser löst. Vielleicht ist der enum da ganz fehl.
wschleifer schrieb:
oder gibt es bessere Möglichkeiten?
Naja, statt der #define-Orgie ala boost, könnte es mit rekursiven #includes vielleicht ganz geschmeidig gehen.
-
Ich versuche mal mein Problem etwas anders zu beschreiben:
Der enum ist eine lange Fehlerliste:
typedef enum { eFkt1Fehler1 eFkt1Fehler2 eFkt1Fehler3 eFkt2Fehler1 eFkt2Fehler2 eFkt2Fehler3 eFkt3Fehler1 eFkt3Fehler2 eFkt3Fehler3 }T_eFehler;
nun soll es die Funktion2 in Y Dimensionen geben. Diese Dimensionen sollen per weiterem define gesteuert werden können.
wie kann ich das möglichst einfach erweitern?ausgeschrieben wäre das:
typedef enum { eFkt1Fehler1 eFkt1Fehler2 eFkt1Fehler3 eFkt2Idx1Fehler1 eFkt2Idx1Fehler2 eFkt2Idx1Fehler3 eFkt2Idx2Fehler1 eFkt2Idx2Fehler2 eFkt2Idx2Fehler3 . . . eFkt2IdxYFehler1 eFkt2IdxYFehler2 eFkt2IdxYFehler3 eFkt3Fehler1 eFkt3Fehler2 eFkt3Fehler3 }T_eFehler;
Vielen Dank.
W.Schleifer