c++ - used - what is static in c
Diferencia entre la inicialización de variables estáticas en C y C++. (3)
Estaba revisando el código en http://geeksforgeeks.org/?p=10302
#include<stdio.h>
int initializer(void)
{
return 50;
}
int main()
{
static int i = initializer();
printf(" value of i = %d", i);
getchar();
return 0;
}
Este código no se compilará en C porque las variables estáticas deben inicializarse antes de que comience main (). Eso está bien. Pero este código se compilará bien en un compilador de C ++.
Mi pregunta es por qué se compila en un compilador de C ++ cuando estática tiene el mismo uso en ambos idiomas. Por supuesto, los compiladores serán diferentes para estos idiomas, pero no puedo identificar la razón exacta. Si está especificado en el estándar, me encantaría saberlo.
Busqué esta pregunta en SO, encontré 3 enlaces similares pero en vano. Link1 Link2 Link3
Gracias por tu ayuda.
6.7.8 / 4 [C99]
Todas las expresiones en un inicializador para un objeto que tenga una duración de almacenamiento estática serán expresiones constantes o cadenas literales.
En static int i = initializer();
RHS no es una expresión constante y, por lo tanto, el código no se compila en C.
En C ++ no hay tal restricción y el código está bien formado en C ++.
Las variables estáticas en C deben inicializarse con un valor conocido en el momento de la compilación. Este requisito se eliminó en C ++ y puede inicializarlos con expresiones evaluadas en tiempo de ejecución.
Los dos idiomas difieren en esto, y muchos, muchos otros aspectos. Puede escribir fácilmente el código C que será aceptable para un compilador de C ++, pero lo contrario no es cierto.
Se compila en C ++ porque C ++ necesita admitir la inicialización dinámica de todos modos, o no podría tener objetos locales estáticos o no locales con constructores no triviales.
Por lo tanto, dado que C ++ tiene esta complejidad de todos modos, admitir esa inicialización como se muestra no es más complicado de agregar.
En C eso sería un gran problema porque C no tiene ninguna otra razón para respaldar la inicialización realizada al inicio del programa (aparte de la inicialización de cero trivial). En C, los valores iniciales del objeto de archivo o los objetos estáticos locales siempre se pueden colocar de forma estática en la imagen ejecutable.