C Language
constraints
Zoeken…
Opmerkingen
Beperkingen zijn een term die wordt gebruikt in alle bestaande C-specificaties (recent ISO-IEC 9899-2011). Ze zijn een van de drie delen van de taal die wordt beschreven in clausule 6 van de standaard (naast de syntaxis en semantiek).
ISO-IEC 9899-2011 definieert een beperking als een:
beperking, syntactisch of semantisch, waarmee de uiteenzetting van taalelementen moet worden geïnterpreteerd
(Merk ook op dat, in termen van de C-standaard, een "looptijdbeperking" geen soort beperking is en zeer verschillende regels heeft.)
Met andere woorden, een beperking beschrijft een taalregel die een anders syntactisch geldig programma illegaal zou maken. In dit opzicht lijken beperkingen enigszins op ongedefinieerd gedrag, elk programma dat ze niet volgt, is niet gedefinieerd in termen van de C-taal.
Beperkingen daarentegen hebben een heel significant verschil met ongedefinieerd gedrag. Er is namelijk een implementatie vereist om een diagnostisch bericht te geven tijdens de vertaalfase (onderdeel van de compilatie) als een beperking wordt overtreden, dit bericht kan een waarschuwing zijn of de compilatie stoppen.
Dubbele variabelenamen in hetzelfde bereik
Een voorbeeld van een beperking zoals uitgedrukt in de C-standaard is het hebben van twee variabelen met dezelfde naam in een scope 1) , bijvoorbeeld:
void foo(int bar)
{
int var;
double var;
}
Deze code is in strijd met de beperking en moet tijdens het compileren een diagnostisch bericht produceren. Dit is erg handig in vergelijking met ongedefinieerd gedrag, omdat de ontwikkelaar op de hoogte wordt gebracht van het probleem voordat het programma wordt uitgevoerd en mogelijk iets doet.
Beperkingen zijn dus meestal fouten die gemakkelijk kunnen worden gedetecteerd tijdens het compileren, zoals deze. Problemen die leiden tot ongedefinieerd gedrag, maar die moeilijk of onmogelijk te detecteren zijn tijdens het compileren, zijn dus geen beperkingen.
1) exacte formulering:
Als een identificator geen koppeling heeft, mag er niet meer dan één verklaring van de identificator (in een declarator of typeaanduider) zijn met hetzelfde bereik en in dezelfde naamruimte, behalve voor tags zoals gespecificeerd in 6.7.2.3.
Unaire rekenkundige operatoren
De operatoren unary +
en -
zijn alleen bruikbaar op rekenkundige typen, dus als men ze bijvoorbeeld op een struct probeert te gebruiken, zal het programma een diagnose produceren, bijvoorbeeld:
struct foo
{
bool bar;
};
void baz(void)
{
struct foo testStruct;
-testStruct; /* This breaks the constraint so must produce a diagnostic */
}