c++ - diferencias - ¿Hay const en C?
operator() c++ (10)
Aquí se responden las dos primeras preguntas: Const en C
Sí, hay bastantes diferencias en semántica entre const
en C y C ++.
En C ++, las variables
const
del tipo apropiado son expresiones constantes integrales y se pueden usar en un contexto que lo requiera, como los límites de la matriz y en las definiciones enum. En C, no son ni pueden ser.En C ++, las variables globales de
const
tienen enlacesstatic
automáticamente, por lo que puede colocarlos en archivos de encabezado. En C, tales variables tienen un enlace externo y eso generaría errores de definición duplicados en el tiempo del enlace.
Esta pregunta puede ser ingenua, pero:
- ¿hay una palabra clave
const
en C? - ¿Desde que versión?
- ¿hay diferencias semánticas y / o sintácticas entre
const
en C y C ++?
De acuerdo con ESR , se agregó const
en el Anteproyecto de Norma ANSI C. El resumen de Eric Giguere de ANSI C , de 1987, lo confirma.
EDITAR: Esto se parece al borrador en sí : busca "3.5.3 Calificadores de tipo".
Hay una palabra clave "const" en C, y ha estado por mucho tiempo. Si una variable se designa "const", las escrituras están prohibidas. Además, en algunos entornos, las variables declaradas "const" pueden ubicarse en un segmento de datos diferente de otras variables. Este segmento de datos puede ofrecer protección de escritura de hardware, y para sistemas integrados, puede almacenarse en ROM o memoria flash en lugar de memoria RAM (una distinción muy importante en algunos procesadores que tienen mucha ROM o flash más que RAM, por ejemplo, 128K flash y 3.5K RAM, o 2K ROM y 96 bytes RAM).
Tenga en cuenta que el compilador generalmente no hará ninguna inferencia sobre los valores "const" o expresiones que los involucran. Si digo "const char foo [] =" Hello ";" y luego hacer referencia a foo [1], el compilador cargará el valor (que muy probablemente será ''e'') de donde esté almacenado foo [] y usará el valor cargado. A veces, esto permite que los valores sean parcheados en una imagen de código compilado, pero a veces solo desperdicia el código.
Si desea definir un número para que sea una constante "sustituible" en tiempo de compilación, la mejor manera, al menos para las constantes enteras, puede ser el uso de "enum". Por ejemplo, "enum {woozle = 19;}" hará que 19 sea sustituido por "woozle" en todo el código. Tenga en cuenta que a diferencia de las sustituciones textuales; las declaraciones enum obedecen las reglas de alcance apropiadas.
La sematic en C es diferente que en C ++, por ejemplo
unsigned const a = 10;
unsigned A[a];
en el alcance del archivo sería válido en C ++ pero no en C.
No existen diferencias sintácticas entre C y C ++ con respecto a la palabra clave const
, además de una más bien oscura: en C (desde C99) puede declarar los parámetros de la función como
void foo(int a[const]);
que es equivalente a
void foo(int *const a);
declaración. C ++ no es compatible con dicha sintaxis.
Las diferencias semánticas también existen. Como @Ben Voigt ya señaló, en C las declaraciones const
no producen expresiones constantes, es decir, en C no se puede usar un objeto const int
en una etiqueta de case
, como ancho de campo de bits o tamaño de matriz en una matriz no VLA declaración (todo esto es posible en C ++). Además, los objetos const
tienen un enlace externo por defecto en C (enlace interno en C ++).
Hay al menos una diferencia semántica más, que Ben no mencionó. Las reglas de corrección de constidad del lenguaje C ++ admiten la siguiente conversión estándar
int **pp = 0;
const int *const *cpp = pp; // OK in C++
int ***ppp = 0;
int *const *const *cppp = ppp; // OK in C++
Estas inicializaciones son ilegales en C.
int **pp = 0;
const int *const *cpp = pp; /* ERROR in C */
int ***ppp = 0;
int *const *const *cppp = ppp; /* ERROR in C */
En general, cuando se trata de punteros multinivel, C ++ dice que puede agregar const-qualification a cualquier profundidad de direccionamiento indirecto, siempre y cuando también agregue const-qualification hasta el nivel superior.
En C, solo puede agregar la calificación const al tipo apuntado por el puntero de nivel superior, pero no más profundo.
int **pp = 0;
int *const *cpp = pp; /* OK in C */
int ***ppp = 0;
int **const *cppp = ppp; /* OK in C */
Otra manifestación del mismo principio general subyacente es la forma en que funcionan las reglas de corrección de const con matrices en C y C ++. En C ++ puedes hacer
int a[10];
const int (*p)[10] = &a; // OK in C++
Intentar hacer lo mismo en C dará como resultado un error
int a[10];
const int (*p)[10] = &a; /* ERROR in C */
Otras dos diferencias:
const arraytype
(es decir,typedef int A[1]; const A a = { 0 };
) especifica un tipo de matriz constante ( http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#112 y http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1059 ) (y cuyos elementos también están calificados) en C ++, pero un tipo de matriz no constante cuyos elementos están tan calificados en C.const const
es válido en C99 (no válido en C89), no válido en C ++ en ninguna versión (solo se puede repetir semánticamente unaconst
, no sintácticamente). Contrae paraconst
en C99.
Sí, const
ha estado allí desde al menos desde ANSI C (también conocido como C89).
Ciertamente aparece en mi copia de "The C Programming Language (2nd Edition)", Kernighan & Ritchie (publicado en 1988).
Extracto relevante:
Las propiedades
const
yvolatile
son nuevas con el estándar ANSI. El propósito deconst
es anunciar objetos que pueden colocarse en la memoria de solo lectura, y quizás para aumentar las oportunidades de optimización.
Sí, hay una palabra clave const
. Fue agregado como parte del estándar de 1989.
En cuanto a la compatibilidad, aquí hay un párrafo de Harbison & Steele, 5ª edición:
Una declaración de nivel superior que tiene el tipoconst
calificador pero ninguna clase de almacenamiento explícita se considerastatic
en C ++ peroextern
en C. Para permanecer compatible, examine las declaracionesconst
nivel superior y proporcione una clase de almacenamiento explícita. En C ++, las constantes de cadena son implícitamenteconst
; ellos no están en C.
Sí, hay una palabra clave const
en C. Ha estado allí desde C90.
Sintácticamente, puede ocurrir en los mismos lugares que en C ++. Semánticamente, es un poco más laxo, IIRC.
Sí. const
está allí en C, de C89.
Aquí hay una buena lectura sobre el comportamiento de la palabra clave const en C.