Suche
Suche Menü

Makros

Mit sogenannten Makro-Funktionen lassen sich komplexere Ersetzungen realisieren. Man kann diesen Makros, wie bei normalen Funktionen auch,  Argumente übergeben. Da es sich hier um Textersetzungen handelt, werden Datentypen nicht beachtet.

Beispiel 1

Dieses Beispiel teilt einen Variablen-Wert mittels einer Makro-Funktion durch zwei.

#include<stdio.h>
#define HALBIEREN(wert) ((wert) / 2)

int main() {
	int zahl = 8;
	int haelfte = HALBIEREN(zahl);
	printf("%d\n", haelfte);
	return 0;
}

Nach dem Präprozessor sieht der Quelltext wie folgt aus. Zu beachten ist, dass die Klammern auch zur Ersetzung gehören.

#include<stdio.h>

int main() {
	int zahl = 8;
	int haelfte = ((zahl) / 2);
	printf("%d\n", haelfte);
	return 0;
}

Haelfte: 4

Beispiel 2

Hier wird eine Makro-Funktion verwendet, um zwei Variablen-Werte zu addieren.

#include<stdio.h>
#define ADD(a, b) ((a) + (b))

int main() {
	int rechnung = ADD(1, 3) * ADD(2, 4);
	printf("%d\n", rechnung);
	return 0;
}

Klammer-Problematik

Um Rechenfehler zu vermeiden, sollten alle übergebenen Werte, wie auch die gesamte Rechnung in Klammern gesetzt werden, siehe obiges Beispiel. Macht man dies nicht, könnten die im folgenden Beispiel aufgeführten Fehler passieren.

Hier wurde in der Makro-Funktion die gesamte Rechnung nicht in Klammern gesetzt, aufgrund der Punkt-vor-Strich – Regel erhält man ein anderes Ergebnis als gewünscht.

#define ADD(a, b) (a) + (b)
int rechnung = ADD(1, 3) * ADD(2, 4);

/* wird zu dieser Zeile aufgeloest: */
int rechnung = (1) + (3) * (2) + (4);

Ein unerwünschtes Rechenverhalten kann man auch durch das Weglassen der inneren Klammern erhalten. Zum Beispiel bei einer Makro-Funktion für das Multiplizieren von zwei Werten, indem man als Parameter eine weitere Rechnung übergibt.

#define MULT(a, b) (a * b)
int rechnung = MULT(1 + 2, 5 + 1);

/* wird zu dieser Zeile aufgeloest: */
int rechnung = (1 + 2 * 5 + 1);

Beispiel 3

In diesem Beispiel wird eine Makro-Funktion verwendet, um die Werte von zwei Variablen zu vertauschen. Der Makro-Funktion werden die zwei Namen der Variablen und der Datentyp im Parameter mitgeteilt. Der Körper der Makro-Funktion besteht aus vier Anweisungen:

  1. Deklaration einer temporären Variable
  2. Zwischenspeichern des zweiten Wertes in einer temporären Variable
  3. Zweite Variable auf den Wert der ersten Variable setzen
  4. Erste Variable auf den Wert der temporären Variable setzen

#include<stdio.h>
#define TAUSCHE(a, b, typ) { typ temp; temp=b; b=a; a=temp; }

int main() {
	int zahla=4, zahlb=7;
	printf("zahl A: %d\nzahl B: %d\n", zahla, zahlb);
 	TAUSCHE(zahla, zahlb, int);
	printf("zahl A: %d\nzahl B: %d\n", zahla, zahlb);	
	return 0;
}

zahl A: 4
zahl B: 7
zahl A: 7
zahl B: 4

Der Präprozessor wandelt die Zeile, in der sich der Aufruf der Makro-Funktion TAUSCHE befindet, in folgende Zeile um. Das Setzen der Blockklammern ist valide und kann der Ordnung halber gemacht werden.

/* wird zu dieser Zeile aufgeloest: */
{ int temp; temp=zahlb; zahlb=zahla; zahla=temp; };

Beispiel 4

Hier wird das Maximum zweier Zahlen besimmt.

#include<stdio.h>
#define MAX(a, b) ((a) < (b) ? (b) : (a))

int main() {
	int zahla=4, zahlb=7;
	printf("Maximum: %d\n", MAX(zahla, zahlb));	
	return 0;
}