Sök…


Anmärkningar

Begränsningar är en term som används i alla befintliga C-specifikationer (nyligen ISO-IEC 9899-2011). De är en av de tre delarna av språket som beskrivs i klausul 6 i standarden (längs sidosyntax och semantik).

ISO-IEC 9899-2011 definierar en begränsning som en:

begränsning, antingen syntaktisk eller semantisk, genom vilken exponering av språkelement ska tolkas

(Observera också, när det gäller C-standarden, är en "runtime-restriktion" inte en slags begränsning och har omfattande olika regler.)

Med andra ord beskriver en begränsning en regel på språket som skulle göra ett annat syntaktiskt giltigt program olagligt. I detta avseende är begränsningar något som odefinierat beteende, vilket program som inte följer dem definieras inte i termer av C-språket.

Begränsningar å andra sidan har en väsentlig skillnad från odefinierade beteenden. Det krävs nämligen en implementering för att tillhandahålla ett diagnostiskt meddelande under översättningsfasen (del av sammanställningen) om en begränsning bryts, detta meddelande kan vara en varning eller kan stoppa sammanställningen.

Duplicera variabla namn i samma omfattning

Ett exempel på en begränsning som uttrycks i C-standarden är att ha två variabler med samma namn deklarerat i ett omfång 1) , till exempel:

void foo(int bar)
{
    int var;
    double var;
}

Denna kod bryter mot begränsningen och måste producera ett diagnostiskt meddelande vid sammanställningstiden. Detta är mycket användbart jämfört med odefinierat beteende, eftersom utvecklaren kommer att informeras om problemet innan programmet körs och eventuellt göra något.

Begränsningar tenderar således att vara fel som är lätt att upptäcka vid sammanställningstid som denna, problem som resulterar i odefinierat beteende men som skulle vara svåra eller omöjliga att upptäcka vid sammanställningstid är således inte begränsningar.


1) exakt formulering:

C99

Om en identifierare inte har någon länkning, får det inte finnas mer än en deklaration av identifieraren (i en deklarator eller typspecifikator) med samma omfattning och i samma namnutrymme, med undantag för taggar som anges i 6.7.2.3.

Olika aritmetiska operatörer

Unary + och - -operatörerna är endast användbara på aritmetiska typer, om man till exempel försöker använda dem på en struktur kommer programmet att producera en diagnos t.ex.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow