Ricerca…


Osservazioni

I vincoli sono un termine usato in tutte le specifiche C esistenti (recentemente ISO-IEC 9899-2011). Sono una delle tre parti del linguaggio descritte nella clausola 6 dello standard (lungo la sintassi laterale e la semantica).

ISO-IEC 9899-2011 definisce un vincolo come:

restrizione, sintattica o semantica, mediante la quale l'esposizione degli elementi linguistici deve essere interpretata

(Si noti inoltre, in termini di standard C, un "vincolo di runtime" non è un tipo di vincolo e ha regole estensivamente diverse.)

In altre parole, un vincolo descrive una regola della lingua che renderebbe illegale un programma altrimenti sintatticamente valido. Sotto questo aspetto i vincoli sono in qualche modo come un comportamento non definito, qualsiasi programma che non li segue non è definito in termini di linguaggio C.

I vincoli d'altra parte hanno una differenza molto significativa rispetto ai comportamenti non definiti. Vale a dire che è necessaria un'implementazione per fornire un messaggio diagnostico durante la fase di traduzione (parte della compilazione) se un vincolo viene violato, questo messaggio potrebbe essere un avvertimento o potrebbe interrompere la compilazione.

Duplicare nomi di variabili nello stesso ambito

Un esempio di un vincolo come espresso nello standard C sta avendo due variabili dello stesso nome dichiarate in uno scope 1) , ad esempio:

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

Questo codice viola il vincolo e deve produrre un messaggio diagnostico in fase di compilazione. Questo è molto utile rispetto al comportamento non definito, in quanto lo sviluppatore verrà informato del problema prima dell'esecuzione del programma, potenzialmente facendo qualsiasi cosa.

I vincoli tendono quindi ad essere errori facilmente rilevabili in fase di compilazione come questo, problemi che risultano in un comportamento indefinito ma che sarebbero difficili o impossibili da rilevare in fase di compilazione non sono quindi vincoli.


1) formulazione esatta:

C99

Se un identificatore non ha alcun collegamento, non deve esserci più di una dichiarazione dell'identificatore (in un dichiaratore o specificatore del tipo) con lo stesso ambito e nello stesso spazio dei nomi, ad eccezione dei tag specificati in 6.7.2.3.

Operatori aritmetici unari

Gli operatori unari + e - sono utilizzabili solo su tipi aritmetici, quindi se per esempio si tenta di usarli su una struct il programma produrrà una diagnostica ad esempio:

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow