C Language
Restricciones
Buscar..
Observaciones
Las restricciones son un término usado en todas las especificaciones C existentes (recientemente ISO-IEC 9899-2011). Son una de las tres partes del lenguaje descritas en la cláusula 6 de la norma (junto con la sintaxis y la semántica).
ISO-IEC 9899-2011 define una restricción como:
Restricción, ya sea sintáctica o semántica, mediante la cual se debe interpretar la exposición de elementos del lenguaje.
(Tenga en cuenta también que, en términos del estándar C, una "restricción de tiempo de ejecución" no es un tipo de restricción y tiene reglas muy diferentes).
En otras palabras, una restricción describe una regla del lenguaje que haría que un programa por lo demás sintácticamente válido fuera ilegal. En este sentido, las restricciones son algo así como un comportamiento indefinido, cualquier programa que no las siga no está definido en términos del lenguaje C.
Las restricciones, por otro lado, tienen una diferencia muy significativa con respecto a los comportamientos indefinidos. Es decir, se requiere una implementación para proporcionar un mensaje de diagnóstico durante la fase de traducción (parte de la compilación) si se infringe una restricción, este mensaje puede ser una advertencia o puede detener la compilación.
Duplicar nombres de variables en el mismo ámbito.
Un ejemplo de una restricción expresada en el estándar C es tener dos variables del mismo nombre declaradas en un alcance 1) , por ejemplo:
void foo(int bar)
{
int var;
double var;
}
Este código infringe la restricción y debe producir un mensaje de diagnóstico en el momento de la compilación. Esto es muy útil en comparación con un comportamiento indefinido, ya que el desarrollador será informado del problema antes de que se ejecute el programa, haciendo potencialmente cualquier cosa.
Las restricciones, por lo tanto, tienden a ser errores que son fácilmente detectables en el momento de la compilación, como por ejemplo, los problemas que resultan en un comportamiento indefinido pero que serían difíciles o imposibles de detectar en el momento de la compilación no son restricciones.
1) redacción exacta:
Si un identificador no tiene enlace, no habrá más de una declaración del identificador (en un declarador o especificador de tipo) con el mismo alcance y en el mismo espacio de nombre, excepto para las etiquetas como se especifica en 6.7.2.3.
Operadores aritméticos únicos
Los operadores unarios +
y -
solo se pueden usar en tipos aritméticos, por lo tanto, si por ejemplo, uno intenta usarlos en una estructura, el programa producirá un diagnóstico, por ejemplo:
struct foo
{
bool bar;
};
void baz(void)
{
struct foo testStruct;
-testStruct; /* This breaks the constraint so must produce a diagnostic */
}