Definición de variables globales usando un inicializador no constante

3 minutos de lectura

Definicion de variables globales usando un inicializador no constante
viñesh_dino

#include <stdio.h>

int i=10;
int j=i;
int main()
{
    printf("%d",j);
}

Recibo un error que indica que el elemento de inicialización no es una constante. Cuál es la razón detrás de esto?

  • i es una variable, no una constante. Y C no permite inicializadores no constantes para variables globales o estáticas. C es diferente de C++ en este aspecto.

    –Jonathan Leffler

    9 de diciembre de 2012 a las 6:29


  • @ATaylor No. const int no lo resuelve.

    – Vignesh_dino

    9 de diciembre de 2012 a las 6:34

  • @user963472: en C (a diferencia de C++) const Las declaraciones no producen expresiones constantes.

    – Alok Guardar

    9 de diciembre de 2012 a las 6:39

  • @Vignesh_dino: const no significa constante; significa solo lectura. (Y const no siempre implica constant en C++; considerar const int r = rand();.)

    –Keith Thompson

    9 de diciembre de 2012 a las 7:36

Cuál es la razón detrás de esto?

C (a diferencia de C++) no permite la inicialización de valores globales con valores no constantes.

Estándar C99: Sección 6.7.8:

Todas las expresiones en un inicializador para un objeto que tiene una duración de almacenamiento estática serán expresiones constantes o literales de cadena.

  • Vi en Internet que las variables con almacenamiento estático se asignan en el momento de la carga. ¿Tiene esto algo que ver con mi pregunta anterior?

    – Vignesh_dino

    9 de diciembre de 2012 a las 6:38

  • @user963472: No entiendo tu pregunta. ¿Puede por favor elaborar?

    – Alok Guardar

    9 de diciembre de 2012 a las 6:50

Podrías intentar usar:

int i=10;
int j=0;

int main()
{
   j=i;//This should be the first statement in the main() and you achieve the same functionality as ur code
   return 0;
}

La única forma verdadera de C es inicializarlo en tiempo de ejecución. Aunque en C++ su código funcionará bien, sin errores de compilación.

El estándar C prohíbe claramente la inicialización de objetos globales con valores no constantes. los Section 6.7.8 del estándar C99 dice:

Todas las expresiones en un inicializador para un objeto que tiene una duración de almacenamiento estática serán expresiones constantes o literales de cadena.

La definición de un objeto con static storage duration está en la sección 6.2.4:

Un objeto cuyo identificador se declara con vinculación externa o interna, o con el especificador de clase de almacenamiento estático, tiene una duración de almacenamiento estática. Su tiempo de vida es la ejecución completa del programa y su valor almacenado se inicializa solo una vez, antes del inicio del programa.

Definicion de variables globales usando un inicializador no constante
Hormiga

La idea detrás de este requisito es tener todos los objetos de duración de almacenamiento estático inicializados en tiempo de compilación. El compilador prepara todos los datos estáticos en formato preinicializado para que no requiera código de inicialización adicional en tiempo de ejecución. Es decir, cuando se carga el programa compilado, todas esas variables comienzan su vida en un estado ya inicializado.

En la primera versión estandarizada del lenguaje C (C89/90), este requisito también se aplicaba a los inicializadores agregados, incluso cuando se usaban con variables locales.

void foo(void)
{
  int a = 5;
  struct S { int x, y; } s = { a, a }; /* ERROR: initializer not constant */
}

Aparentemente, la razón de esa restricción fue que se suponía que los inicializadores agregados se crearían de antemano en el segmento de datos preinicializado, al igual que las variables globales.

1647664327 89 Definicion de variables globales usando un inicializador no constante
sushant goel

Utilizar esta:-

int i=10,j=1;
int main()
{
  printf("%d",j);
}

Aunque es un cambio menor, pero funcionará.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad