Programmieren - alles kontrollieren 4.937 Themen, 20.662 Beiträge

C/C++: #define, gut oder schlecht?

d-oli / 2 Antworten / Flachansicht Nickles

Hallo

In verschiedenen C/C++- Fachbüchern habe ich gelesen, es sollen möglichst keine "magic numbers" verwendet werden.

Beispiel:
// schlecht?
toggleButton tglBtn[ 6 ];
// gut?
#define NUM_OF_TGL 6;
toggleButton tglBtn[ NUM_OF_TGL];
// besser?
const int numOfTgl = 6;
toggleButton tglBtn[ tglBtn ];
// Am besten?
typdef enum lengthDefs{
   eBtn = 8,
   eTgl = 6,
   etc.
} lengthDefs;
toggleButton tglBtn[ lengthDefs::eTgl ];

Ich arbeite zur Zeit an einer C/C++- Applikation, die Motif als grafische Bibliothek und OCI als Anbindung an eine Oracle- Datenbank verwendet. Die Applikation wurde bereits erfolgreich von HPUX nach Red Hat Linux portiert. Verwendet wird ein GNU- Compiler der 3er- Reihe.
Eines der Probleme ist, dass die Applikation voll von "magic numbers" ist.

Beispiel:
// xyz.h
...
toggleButton tglBtn[ 6 ];

// xyz.C

for( i = 0; i    new toggleButton( theWidget, this, tglBtn[ i ], … );


Was ich schlecht daran finde ist, dass ich im Header und in der C- Datei Anpassungen vornehmen muss um einen "Toggle Button" einzufügen.

Wie kann es besser gemacht werden. Ich dachte an "defines". Es soll aber Probleme geben können, betreffend Symboltabellengrösse des Compilers oder betreffend sinnlosen "Cross Dependencies". Ist da was dran?
Welche Lösung (define, const, enum) findet ihr am besten? Eure Meinungen würden mich interessieren.

Vielen Dank.
Gruss, d-oli

Konstruktive Kritik zeichnet sich dadurch aus, dass sie höflich, nützlich und sachlich ist.
bei Antwort benachrichtigen
thomas woelfer d-oli „C/C++: #define, gut oder schlecht?“
Optionen

grundsaetzlich ist es immer besser symbolische namen statt fest kodierten integern zu verwenden - das erhoeht einfach die lesbarkeit.

enums sollte man dann verwenden, wenn es sich bei der damit beschriebenen sachlage auch tatsaechlich um eine handelt, bei der etwas 'enumeriert' werden kann: also dann, wenn es tatsaechlich einen eindeutigen namen für einen wert gibt. m.a.w.: Ein enum mit den werden ein,zwei,drei,zwoelf,dreizehn bringt nicht viel... - einer fuer wochentage schon.

davon ab sind 'const int NameDerKonstante=...' #defines grundsätzlich vorzuziehen, da es sich bei #defines ja nur um Mechanismen zur textersetzung handelt bei denen die 'lustigsten' seiteneffekte eintreten können. (naja, zugegegeben: bei #defines die 'konstante' definieren muss man sich wohl schon echt mühe geben... :-)) [nun gibt es aber faelle wo man konstante per 'const' nicht so benutzen kann wie kostante werte ... dann bleibt einem nichts anderes uebrig auf #defines zurueck zu greifen.]

in den meisten faellen sollte es aber ein:

const int numButtons = 6;

tun.

WM_MY0.02$




this posting contains no tpyos.
bei Antwort benachrichtigen