operator diferencias descargar cppreference c++ c const language-comparisons

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 enlaces static 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 ++?


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:


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 y volatile son nuevas con el estándar ANSI. El propósito de const 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 tipo const calificador pero ninguna clase de almacenamiento explícita se considera static en C ++ pero extern en C. Para permanecer compatible, examine las declaraciones const nivel superior y proporcione una clase de almacenamiento explícita. En C ++, las constantes de cadena son implícitamente const ; 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.