Twitter und Facebook-Anbindung
X
Tweet Follow @twitterapi
!!! Anbindung an twitter und facebook öffnen !!!

Wenn Ihnen mein Online-Buch gefällt,
dann bedanken Sie sich doch mit einer kleinen Spende...

6.1 Quelltextbausteine mit #define

6.1 Quelltextbausteine mit #define

Ein sehr nützliches Werkzeug sind die s.g. "defines". Mit ihnen kann man Werte/Konstanten, ganze Textbausteine, oder sogar Codefragmente generieren. Der größte Vorteil liegt meines Erachtens darin, dass man eine zentrale Stelle hat, an der Sachen vereinbart werden können, die z.B. dann für das gesamte Projekt gelten. So spart man sich stundenlanges suchen nach Ausgabetexten, um Rechtschreibfehler zu verbessern - man hat alles auf einen Blick. Des Weiteren wird dafür kein zusätzlicher Speicherplatz verbraucht, da der Präprozessor im gesamten Quelltext nach diesen Bausteinen sucht und sie mit dem ersetzt, was Sie definiert haben. Die eigentlichen Definitionen sind dann am Ende nicht mehr in Ihrem Programm. Es handelt sich also um ein reines Suchen und Ersetzen.

Das Schema sieht so aus: #define <SuchMarke> <ErsetzterQuelltext>

Hier mal ein kleines Beispiel.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
					
#define	DEF_STRING_EINGABE	"Bitte geben Sie einen Wert ein: "
#define	DEF_STRING_AUSGABE	"Sie haben %i eingegeben!\n"



// Hauptfunktion der Anwendung ////////////////////////////////////////////////
int main(int argc, char** argv) {
	int iWert;
	printf(DEF_STRING_EINGABE);
	scanf("%i", &iWert);
	printf(DEF_STRING_AUSGABE, iWert);
	
	return 0;
} // main /////////////////////////////////////////////////////////////////////
					

Ausgabe:

Bitte geben Sie einen Wert ein: 15
Sie haben 15 eingegeben!
		

Wie Sie vielleicht schon erkennen, wird der Textbaustein DEF_STRING_EINGABE mit der dazugehörigen Definition ersetzt, nämlich "Bitte geben Sie einen Wert ein". Dabei ist wichtig, dass der Name eines "defines", immer nur aus einem Wort bestehen darf. Dahinter darf so viel stehen, wie Sie lusstig sind und das wird dann wirklich eins zu eins ersetzt (also auch alle Sonderzeichen wie Semikolon oder Anführungszeichen). Des Weiteren sollten Sie "defines" immer komplett in Großbuchstaben schreiben, damit man dann später im weiteren Quelltext sofort sieht, dass dort etwas ersetzt wird. Ich bevorzuge sogar immer noch den Typ mit einfließen zu lassen, aber das ist Geschmackssache.

Mit diesem Werkzeug kann man aber auch, wie gesagt, Quelltext zusammen bauen, da man "defines" auch ineinander verschachteln kann. Allerdings sollte man mit so etwas vorsichtig umgehen, da man so schnell Verwirrung stiften kann. Trotzdem möchte ich Ihnen kurz zeigen, wie das geht.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
					
#define	DEF_INT_ERROR		1
#define	DEF_STRING_ERROR	"Der Fehler %i ist aufgetreten!", DEF_INT_ERROR
#define	DEF_PRESS_KEY		printf("Druecken Sie <ENTER> um fortzufahren!");\
				fflush(stdin);\
				getchar();



// Hauptfunktion der Anwendung ////////////////////////////////////////////////
int main(int argc, char** argv) {
	printf(DEF_STRING_ERROR);
	DEF_PRESS_KEY
	
	return 0;
} // main /////////////////////////////////////////////////////////////////////
					

Ausgabe:

Der Fehler 1 ist aufgetreten
Druecken Sie <ENTER> um fortzufahren!
		

Ein "define" muss normalerweise innerhalb einer Zeile stehen. Möchte man aber, aus Gründen der Übersichtlichkeit, doch einen Zeilenumbruch machen, dann setzt man ein "\" am Ende der Zeile und signalisiert somit, dass die Definition in der nächsten Zeile weiter geht.

Hin und wieder kommt es vor, dass man so ein Textbaustein zwischendurch neu belegen möchte. Auch dies ist möglich und sieht wie folgt aus.

 1
 2
 3
					
#define	DEF_STRING	"Hallo"
#undef	DEF_STRING
#define	DEF_STRING	"Hallo Welt"
					

Aber trotz der ganzen Bequemlichkeit, sollten Sie für Quelltextfragmente entweder wirklich Funktionen bauen oder, wie ich später noch zeigen werde, Templates bauen. Dieser Mechanismus wurde vorwiegend in der Vergangenheit gerne mal eingesetzt um das Programm noch ein wenig schneller laufen zu lassen, da ein Funktionsaufruf zeit kostet (was auf den heutigen schnellen Rechnern nicht mehr von Bedeutung ist). Für Konstanten und Textbausteine wie Ein - und Ausgaben, sind "defines" allerdings sehr genial.

Abschließend möchte ich noch erwähnen, dass es einen ganz großen Haken an diesem Mechanismus gibt. Wenn man ein Programm debuggen will, kann man nicht sehen, welcher Wert oder welche Codezeilen sich hinter einem "define" verbergen. Das kann sehr nervig sein und die Arbeit ungemein schwerer machen. Das ist genau der Grund, warum dieser Mechanismus langsam "ausstirbt". Fangen Sie jetzt also nicht an, nur noch "defines" zu benutzen – setzen Sie diese mit Bedacht ein, wenn Sie sie verwenden möchten.

Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012