#define M 100 #define N 2*MIm C-Quelltext, der dem Compiler übergeben wird, erscheinen an den Positionen, an denen symbolische Konstanten standen, Literale.
Symbolische Konstanten werden rein formal ersetzt, der Präprozessor ist nicht in der Lage, Typprüfungen durchzuführen.
Mit ANSI-C wurde das Schlüsselwort const als sogenannter
Typ-Modifizierer eingeführt:
Einer Variablen-Deklaration kann das Schlüsselwort const
vorangestellt werden. Der Wert der derart deklarierten Variablen kann
nicht durch direkte Zuweisungen verändert werden.
Beispiel:
const n = 100; /* Typ int wird angenommen */ const float eps = 0.005; const int *pc; /* Zeiger auf konstantes Integer */ int * const cp; /* konstanter Zeiger auf Integer */Es handelt sich dabei jedoch nicht um echte Konstanten. Die Werte sind zwar nicht auf direktem Wege veränderbar, es gibt jedoch indirekte Wege zur Manipulation.
Beispiel:
const int i = 5; i = 10; /* !!! Fehler !!! */ i++; /* !!! Fehler !!! */Das folgende Beispiel zeigt, daß es ohne großem Aufwand möglich ist, den Wert von "Konstanten" zu manipulieren:
#include <stdio.h>
int main(void)
{
const int *pc;
const int ic = 0;
int *p;
printf("Konstante ic = %d\n", ic); /* liefert 0 */
pc = ⁣
p = (int *)pc;
*p = 1;
printf("Konstante ic = %d\n", ic); /* liefert 1 */
return 0;
}
Die meisten getesteten Rechner/C-Systeme (PC, Sparc, Motorola) ließen
das Ändern der Konstante zu, lediglich in einem Fall (xlc unter
AIX 3.2 auf RS/6000) kam es beim Versuch die Konstante zu verändern,
zu einem Programmabbruch.
Wird const im Zusammenhang mit anderen Deklarationsanweisungen
verwendet, so ist sehr genau auf die jeweilige Wirkung zu achten.
Beispiel:
const struct s { int a, b; } x; /* s konstant */
struct s y; /* y nicht konstant */
typedef const struct s { int a, b; } stype;
stype x; /* x konstant */
stype y; /* y konstant */
Beispiel:
char *const aptr = mybuf; /* konstanter Zeiger */ *aptr = 'a'; /* !!! Fehler !!! */ aptr = yourbuf; /* Okay */Die Anwendungsmöglichkeiten von const in C und C++ unterscheiden sich ein wenig.
const int max = 255;
int array[max]; /* Legal in C++,
nicht zulaessig in den meisten C Systemen */
In ANSI C kann in dieser Situation nur mit symbolischen Konstanten
gearbeitet werden:
#define max 255 int array[max];