En el C , C ++ y D lenguajes de programación , un tipo de clasificación es una palabra clave que se aplica a un tipo , lo que resulta en un tipo cualificado. Por ejemplo, const int
es un tipo calificado que representa un entero constante, mientras que int
es el tipo no calificado correspondiente, simplemente un entero. En D, estos se conocen como constructores de tipos , por analogía con los constructores en la programación orientada a objetos .
Los calificadores de tipo son una forma de expresar información adicional sobre un valor a través del sistema de tipos y garantizar la exactitud en el uso de los datos. Los calificadores de tipo no se usan generalmente fuera de la familia de lenguajes C / C ++: muchos lenguajes tienen una noción de constantes, pero expresan esto mediante el enlace de nombres siendo constante (una "variable que no varía"), en lugar de a través del sistema de tipos ; consulte las alternativas a continuación.
Por idioma
C / C ++
A partir de 2014[actualizar]y C11 , hay cuatro calificadores de tipo en el estándar C: const
( C89 ), volatile
( C89 ), restrict
( C99 ) y _Atomic
( C11 ); este último tiene un nombre privado para evitar chocar con los nombres definidos por el usuario. [1] Los dos primeros de estos, const
y volatile
, también están presentes en C ++, y son los únicos calificadores de tipo en C ++. Por lo tanto, en C ++ el término " tipo calificado cv " (para c onst y v olatile) se usa a menudo para "tipo calificado", mientras que los términos " tipo calificado c " y " tipo calificado v " se usan cuando solo uno de los calificadores son relevantes.
De estos, const
es , con mucho, el más conocido y el más utilizado, aparece en las bibliotecas estándar C y C ++ y se encuentra en cualquier uso significativo de estos lenguajes, que debe satisfacer const-correctness . Los otros calificadores se usan para programación de bajo nivel y, aunque se usan ampliamente allí, los programadores típicos rara vez los usan. Sin embargo, durante un tiempo volatile
algunos programadores de C ++ lo usaron para la sincronización durante el subproceso, aunque esto se desaconsejó y ahora está roto en la mayoría de los compiladores.
D
En los constructores de tipo D son const
, immutable
, shared
, y inout
. immutable
es una variante más fuerte de const
, indica datos que nunca pueden cambiar su valor, mientras que const
indica datos que no se pueden cambiar a través de esta referencia: es una vista constante de datos posiblemente mutables. shared
se utiliza para datos compartidos en subprocesos múltiples (como volatile
se utilizó brevemente en C ++). inout
es un comodín que se utiliza para permitir que las funciones que no modifican datos (y, por lo tanto, solo se preocupan por el tipo no calificado de datos) devuelvan el mismo tipo calificado que la entrada. const
y immutable
también se pueden utilizar como especificadores de clases de almacenamiento.
Sintaxis
En C y C ++, un tipo se da en una declaración de función o declaración de variable dando uno o más especificadores de tipo y, opcionalmente, calificadores de tipo. Por ejemplo, una variable entera se puede declarar como:
int x ;
donde int
es el especificador de tipo. Una variable entera sin signo se puede declarar como:
unsigned int x ;
donde ambos unsigned
y int
son especificadores de tipo. Una variable entera constante sin signo se puede declarar como:
const unsigned int x ;
donde const
es un calificador tipo, que el tipo calificado de x
IS const unsigned int
y el tipo no calificado es unsigned int
.
Además, las declaraciones de variables tienen un especificador de clase de almacenamiento opcional . Apropiadamente, este es un tema separado, distinto del tipo, aunque const
en una declaración de variable también se considera que tiene implicaciones para la clase de almacenamiento, es decir, que se puede almacenar en memoria de solo lectura.
Corrección volátil
El otro calificador en C y C ++, volatile
indica que un objeto puede ser cambiado por algo externo al programa en cualquier momento y, por lo tanto, debe volver a leerse de la memoria cada vez que se accede a él.
El calificador se encuentra con mayor frecuencia en código que manipula hardware directamente (como en sistemas integrados y controladores de dispositivos ) y en aplicaciones multiproceso (aunque a menudo se usa incorrectamente en ese contexto; consulte los enlaces externos en la variable volátil ). Puede usarse exactamente de la misma manera que const
en las declaraciones de variables, punteros, referencias y funciones miembro y, de hecho, a volatile
veces se usa para implementar una estrategia similar de diseño por contrato que Andrei Alexandrescu llama volatile
-correctness, [2] aunque esto es mucho menos común que la const
corrección. El volatile
calificador también se puede quitar const_cast
y se puede combinar con el const
calificador como en este ejemplo:
// Configure una referencia a un registro de hardware de solo lectura que esté // mapeado en una ubicación de memoria codificada. const volatile int & hardwareRegister = * reinterpret_cast < int *> ( 0x8000 );int currentValue = hardwareRegister ; // Leer la ubicación de la memoria int newValue = hardwareRegister ; // Leelo de nuevohardwareRegister = 5 ; // Error, no se puede escribir en una ubicación constante
Porque hardwareRegister
es así volatile
, no hay garantía de que mantendrá el mismo valor en dos lecturas sucesivas aunque el programador no pueda modificarlo. La semántica aquí indica que el valor del registro es de solo lectura, pero no necesariamente invariable.
Historia
La noción de un calificador de tipo fue introducida, junto con el ejemplo de readonly
(luego renombrado const
) por Bjarne Stroustrup en un Memorando Técnico interno de Bell Labs de 1981, [3] e implementado en C con Clases , el predecesor de C ++ . [4] En cuanto a la motivación, Stroustrup escribe: [4]
- "Cumplió dos funciones: como una forma de definir una constante simbólica que obedece a reglas de alcance y tipo (es decir, sin usar una macro) y como una forma de considerar inmutable un objeto en la memoria".
const
luego fue adoptado en C como parte de la estandarización, y aparece en C89 (y versiones posteriores) junto con otro calificador de tipo volatile
, que fue inventado por el comité de estándares ANSI C (X3J11). [5] volatile
apareció en 1985; [6] y un uso temprano fue en la compilación del kernel de UNIX para MIPS , para permitir la compilación optimizada al evitar que las optimizaciones habituales se apliquen a variables volátiles. [7] En noalias
la reunión de diciembre de 1987 del comité X3J11 se sugirió un calificativo adicional , pero fue rechazado; su objetivo fue finalmente cumplido por el restrict
clasificado en C99. La motivación para noalias
era complementaria a volatile
, a saber, que indicaba que incluso se podían realizar optimizaciones normalmente inseguras. Ritchie no apoyó mucho a los calificadores de tipo, argumentando que no "llevaban su peso", pero en última instancia no defendió su eliminación del estándar; [8] se opuso noalias
, sin embargo, y fue eliminado del borrador.
Java no tiene calificadores de tipo, y se omitió de manera notoria const
: una propuesta de 1999 para agregarlo fue rechazada, en particular porque agregarlo después del hecho y luego cambiar la biblioteca estándar para usarlo consistentemente habría roto la compatibilidad. [9] Sin embargo, Java inicialmente dejó abierta la posibilidad de implementación const
, notable porque const
es una palabra reservada , aunque en realidad no se usa como palabra clave . En cambio, Java tiene la palabra clave orientada a objetos final
, que se usa para calificar atributos (y de ahí también para variables locales) como constantes, pero no para calificar tipos.
Alternativas
Otros lenguajes adoptan un enfoque diferente, considerando la constancia como una propiedad de un identificador (o enlace de nombre ), no un tipo. Por tanto, estos lenguajes tienen identificadores constantes (correspondientes a "variables" que no varían) con asignación única, pero no tienen una noción de const-corrección: dado que la constancia no es parte del tipo, no hay posibilidad de desajuste de tipos. Los ejemplos incluyen Ada 83 con objetos constantes y una constant
palabra clave, [10] [a] y Java con la final
palabra clave.
Notas
- ^ El estándar Ada llama a esto una " palabra reservada "; consulte ese artículo para conocer su uso.
Referencias
- ^ C11: El nuevo estándar C , Thomas Plum
- ^ " genérica: volátil: el mejor amigo del programador multiproceso: corrección volátil o cómo hacer que su compilador detecte las condiciones de carrera por usted"ón> por Andrei Alexandrescu en elforo de expertos de C ++ de la revista de usuarios de C / C ++
- ^ Bjarne Stroustrup , "Extensiones del concepto de tipo de lenguaje C". Memorando técnico interno de Bell Labs, 5 de enero de 1981.
- ↑ a b Rivalidad entre hermanos: C y C ++ , Bjarne Stroustrup , 2002, p. 5
- ↑ Dennis M. Ritchie , " The Development of the C Language Archived 2015-01-10 at archive.today ", 2003: "X3J11 también introdujo una serie de adiciones y ajustes más pequeños, por ejemplo, los calificadores de tipo const y volatile , y reglas de promoción de tipo ligeramente diferente ".
- ^ Aparece en las notas de la charla técnica de la reunión del Grupo de usuarios del sistema UNIX europeo (EUUC) "El borrador del estándar ANSI para el lenguaje de programación C" por Mike Banahan, 13 de septiembre de 1985, como se imprimió en el Boletín del Grupo de usuarios de sistemas Unix de Australia (AUUGN ), Vol.6, No 6 , pág. 73
- ^ John Mashey (16 de agosto de 1991). "Re: ¿RISC vs CISC? ¿Llamar a las cosas por su nombre?" . Grupo de noticias : comp.arch . Usenet: [email protected] .
- ^ "Permítanme comenzar diciendo que no estoy convencido de que incluso los calificadores previos a diciembre ('const' y 'volatile') tengan su peso; sospecho que lo que agregan al costo de aprender y usar el idioma no es "Volátil", en particular, es un adorno para aplicaciones esotéricas, y mucho mejor expresado por otros medios. Su principal virtud es que casi todos pueden olvidarlo. "Const" es a la vez más útil y más entrometido; no se puede evitar conocerlo, debido a su presencia en la interfaz de la biblioteca. Sin embargo, no defiendo la eliminación de los calificadores, aunque solo sea porque es demasiado tarde ".
- ^ JDK-4211070: Java debería admitir parámetros const (como C ++) para el mantenimiento del código [ sic ]
- ^ 1815A , 3.2.1. Declaraciones de objeto :
"El objeto declarado es una constante si la palabra reservada constante aparece en la declaración de objeto; la declaración debe incluir una inicialización explícita. El valor de una constante no se puede modificar después de la inicialización. Parámetros formales de modo de entrada de subprogramas y entradas , y los parámetros formales genéricos del modo en, también son constantes; un parámetro de bucle es una constante dentro del bucle correspondiente; un subcomponente o porción de una constante es una constante ".
enlaces externos
- Estándar C11
- Constructores de tipos