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:

C99

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 */
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow