C Language
vincoli
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:
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 */
}