![]() |
|
|
Häufig stehen Sie vor der Situation, daß Sie zusammen gehörige Informationen an unterschiedlichen Stellen definieren müssen, da sie nicht die gleiche Struktur aufweisen. Ein ganz einfaches Beispiel sind Fehlercodes und die zugehörigen Klartext-Meldungen: eines sind Zahlen, das andere Strings.
Sie können sie nicht an einer Stelle definieren, das läßt die Syntax von C nicht zu. Also definieren Sie die Codes über eine enum-Anweisung (oder entsprechende #defines) und die Texte mittels eines Arrays. Typischerweise sieht das so aus:
/* Definition der 'return codes' */
enum {
rtOK,
rtIllegFormat,
rtIllegValue,
rtInputError
};
/* Definition der entsprechenden Texte */
char *msg[] = {
"OK",
"Illegales Eingabeformat",
"Illegaler Wert",
"Allgemeiner Eingabe-Fehler"
};
Wenn Sie zu einem Code den passenden Text ausgeben wollen, indizieren Sie msg entsprechend:
printf( "Der Text zu Code 'rtIllegValue' ist '%s'.\n",
msg[rtIllegValue]);
Es funktioniert so, wie gewünscht - das ist nicht das Problem. Unschön - zumindest in meinen Augen - ist lediglich die Tatsache, daß getrennt ist, was eigentlich zusammen gehört. Bei drei oder vier Definitionen ist das belanglos - es lassen sich noch alle Informationen auf einer Bildschirmseite darstellen und auf Korrektheit prüfen.
Aber was ist, wenn es 50 sind? Oder wenn es nicht nur um zwei Kategorien geht (Codes und Meldungen), sondern um einige mehr? Bei einer Meßdaten-Erfassung vielleicht um Bezeichnung, Kanal-Nr., Startwert, Endwert, Verstärkung, Offset, Trigger-Schranke, etc.? Dann schleichen sich leicht Fehler ein, vor allem bei späteren Änderungen bzw. Erweiterungen des Programms.
Das folgende Verfahren vermeidet dieses Problem: Sie definieren alles, was zusammen gehört, an einer Stelle, und lassen den Compiler sich die jeweils benötigte (Teil-) Information besorgen.
Der ganze Trick besteht darin, den Pre-Prozessor dazu zu benutzen, Makros selektiv auszuwerten.
Auf das obige Beispiel angewandt, sieht das so aus:
Das Header-File sieht dann etwa so aus:
/*
* File rt_code2.h
*/
/* No macro guard, please */
#ifdef MK_TEXT
#define RC( code, txt) txt
#else
#define RC( code, txt) code
#endif
/* Gemeinsame Definition von 'return codes' und Texten */
RC( rtOK, "OK"),
RC( rtIllegFormat, "Illegales Eingabeformat"),
RC( rtIllegValue, "Illegaler Wert"),
RC( rtInputError, "Allgemeiner Eingabe-Fehler")
In Ihrem Programm binden Sie es einmal ein, wenn Sie die Codes via enum-Anweisung definieren und ein zweites Mal - jetzt mit MK_TEXT definiert - wenn Sie die Meldungstexte brauchen. Das sieht dann so aus:
/*
* File rt_code2.c
*/
#include <stdio.h>
/* Definition der 'return codes' */
enum {
#include "rt_code2.h"
};
/* Definition der entsprechenden Texte */
#define MK_TEXT
char *msg[] = {
#include "rt_code2.h"
};
int main( void)
{
printf( "Der Text zu Code 'rtIllegValue' ist '%s'.\n",
msg[rtIllegValue]);
return 0;
}
Es ist möglich, daß Ihr Compiler Ihnen eine Warnung ausgibt:
Erweiterung von Makro RC verschieden von vorheriger Erweiterung
Diese Meldung können Sie beruhigt ignorieren, hierauf beruht ja das Verfahren.
Finden Sie nicht auch, daß es in dieser Form
/* Gemeinsame Definition von 'return codes' und Texten */
RC( rtOK, "OK"),
RC( rtIllegFormat, "Illegales Eingabeformat"),
...
auch bei umfangreicheren Definitionen leichter ist, Fehler zu vermeiden?
Sie können das Beispiel herunterladen, aber
beachten Sie bitte auch die Nutzungsbedingungen.
Hat dieser Beitrag Ihnen gefallen? Nutzt Ihnen der Tip? Dann bitte ich Sie um einen kurzen Kommentar. Wenn Sie hier klicken, brauchen Sie nur noch Ihre Meinung einzutragen.
Sie können sich auch benachrichtigen lassen, wenn es hier etwas Neues gibt: Wählen Sie die Themen aus, die Sie interessieren und geben Sie an, wie oft - oder wie selten - Sie informiert werden wollen.
Copyright © Helmut Giese, email: hgiese@ratiosoft.com
Parkstr. 41, 34119 Kassel, Tel.: 0561 - 766 59 50, Fax: 0561 - 766 59 51
Königstor 59, 34119 Kassel, Tel.: 0561 - 739 35 30, Fax: 0561 - 739 35 31
Web Design von Bianca Engler: email
internet