C Language
Ograniczenia
Szukaj…
Uwagi
Ograniczenia są terminem stosowanym we wszystkich istniejących specyfikacjach C (ostatnio ISO-IEC 9899-2011). Są jedną z trzech części języka opisanego w klauzuli 6 normy (obok składni i semantyki).
ISO-IEC 9899-2011 definiuje ograniczenie jako:
ograniczenie składniowe lub semantyczne, za pomocą którego należy interpretować ekspozycję elementów językowych
(Należy również pamiętać, że pod względem standardu C „ograniczenie czasu wykonywania” nie jest rodzajem ograniczenia i ma bardzo różne reguły).
Innymi słowy, ograniczenie opisuje regułę języka, która sprawiłaby, że w przeciwnym razie poprawny składniowo program byłby nielegalny. Pod tym względem ograniczenia są trochę jak niezdefiniowane zachowanie, każdy program, który ich nie przestrzega, nie jest zdefiniowany w języku C.
Z drugiej strony ograniczenia mają bardzo znaczącą różnicę w stosunku do niezdefiniowanych zachowań. Mianowicie wymagana jest implementacja w celu dostarczenia komunikatu diagnostycznego podczas fazy tłumaczenia (część kompilacji), jeśli złamane zostanie ograniczenie, komunikat ten może być ostrzeżeniem lub może zatrzymać kompilację.
Zduplikowane nazwy zmiennych w tym samym zakresie
Przykładem ograniczenia wyrażonego w standardzie C jest zadeklarowanie dwóch zmiennych o tej samej nazwie w zakresie 1) , na przykład:
void foo(int bar)
{
int var;
double var;
}
Ten kod narusza ograniczenie i musi wygenerować komunikat diagnostyczny w czasie kompilacji. Jest to bardzo przydatne w porównaniu z niezdefiniowanym zachowaniem, ponieważ deweloper zostanie poinformowany o problemie przed uruchomieniem programu, potencjalnie robiąc cokolwiek.
Ograniczenia są więc zwykle błędami, które są łatwo wykrywalne w czasie kompilacji, takie jak to; problemy, które powodują niezdefiniowane zachowanie, ale które byłyby trudne lub niemożliwe do wykrycia w czasie kompilacji, nie są zatem ograniczeniami.
1) dokładne sformułowanie:
Jeżeli identyfikator nie ma powiązania, nie może istnieć więcej niż jedna deklaracja identyfikatora (w deklaratorze lub specyfikatorze typu) o tym samym zakresie i tej samej przestrzeni nazw, z wyjątkiem znaczników określonych w 6.7.2.3.
Jednoargumentowe operatory arytmetyczne
Jednoargumentowe operatory +
i -
są użyteczne tylko dla typów arytmetycznych, dlatego jeśli na przykład spróbujemy użyć ich w strukturze, program wygeneruje komunikat diagnostyczny, np .:
struct foo
{
bool bar;
};
void baz(void)
{
struct foo testStruct;
-testStruct; /* This breaks the constraint so must produce a diagnostic */
}