C Language
Einschränkungen
Suche…
Bemerkungen
Einschränkungen sind ein Begriff, der in allen vorhandenen C-Spezifikationen verwendet wird (kürzlich ISO-IEC 9899-2011). Sie sind einer der drei Teile der in Abschnitt 6 der Norm beschriebenen Sprache (neben Syntax und Semantik).
ISO-IEC 9899-2011 definiert eine Einschränkung als:
Einschränkung, entweder syntaktisch oder semantisch, durch die die Exposition von Sprachelementen interpretiert werden soll
(Bitte beachten Sie auch, dass in Bezug auf den C-Standard eine "Laufzeitbeschränkung" keine Art von Einschränkung ist und weitgehend andere Regeln hat.)
Mit anderen Worten beschreibt eine Einschränkung eine Regel der Sprache, die ein sonst syntaktisch gültiges Programm illegal machen würde. In dieser Hinsicht ähneln Einschränkungen gewissermaßen undefiniertes Verhalten, jedes Programm, das ihnen nicht folgt, ist nicht in Bezug auf die C-Sprache definiert.
Einschränkungen dagegen haben einen sehr signifikanten Unterschied zu undefinierten Verhalten. Es ist nämlich eine Implementierung erforderlich, um während der Übersetzungsphase (Teil der Kompilierung) eine Diagnosemeldung bereitzustellen, wenn eine Einschränkung verletzt wird. Diese Nachricht kann eine Warnung sein oder die Kompilierung stoppen.
Doppelte Variablennamen im selben Bereich
Ein Beispiel für eine Einschränkung, wie sie im C-Standard zum Ausdruck kommt, besteht darin, dass zwei Variablen mit demselben Namen in einem Gültigkeitsbereich 1) deklariert sind, zum Beispiel:
void foo(int bar)
{
int var;
double var;
}
Dieser Code verstößt gegen die Einschränkung und muss zur Kompilierzeit eine Diagnosemeldung erzeugen. Dies ist sehr nützlich im Vergleich zu undefiniertem Verhalten, da der Entwickler vor der Ausführung des Programms über das Problem informiert wird und möglicherweise irgendetwas tut.
Einschränkungen sind daher tendenziell Fehler, die zum Zeitpunkt des Kompilierens leicht erkannt werden können. Probleme, die zu undefiniertem Verhalten führen, aber zum Zeitpunkt des Kompilierens schwer oder nicht zu erkennen wären, sind daher keine Einschränkungen.
1) genaue Formulierung:
Wenn ein Bezeichner keine Verknüpfung hat, darf es nicht mehr als eine Deklaration des Bezeichners (in einem Deklarator oder Typbezeichner) mit demselben Gültigkeitsbereich und demselben Namensraum geben, mit Ausnahme der in 6.7.2.3 angegebenen Tags.
Unäre arithmetische Operatoren
Die unären +
und -
Operatoren können nur für arithmetische Typen verwendet werden. Wenn Sie beispielsweise versuchen, sie für eine Struktur zu verwenden, erzeugt das Programm eine Diagnose, z.
struct foo
{
bool bar;
};
void baz(void)
{
struct foo testStruct;
-testStruct; /* This breaks the constraint so must produce a diagnostic */
}