Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

454
Vistas
ARCHIVO * ..=stdout: el elemento inicializador de error no es constante

Mi código C era el siguiente:

 [Linux:/si/usr/hrl]vi test.c #include <stdio.h> FILE * hw = stdout; int main(void) { return 0; }

Cuando compilo en SUSE, comete el error así:

 [Linux:/si/usr/hrl]cc test.c -o test test.c:3: error: initializer element is not constant

Busco el archivo de encabezado stdio.h y encuentro que stdout parece haberse definido como una constante. Entonces, ¿por qué se produce el error? Por cierto, compilo el mismo código en AIX, resulta exitoso.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

El estándar no requiere que stdin , stdout y stderr sean constantes.

El borrador n1256 para C99 dice en 7.19.1 Entrada/salida <stdio.h>

El encabezado declara...
...
TMP_MAX
que se expande a una expresión constante entera ...

stderr stdin stdout
que son expresiones de tipo ''puntero a ARCHIVO'' ...

(enfatiza el mio)

Se establece explícitamente que algunos otros valores son constantes, mientras que no se dice nada para stdin , stdout y stderr

Entonces debes poner inicialización en main:

 #include <stdio.h> FILE * hw; int main(void) { hw = stdout; ... return 0; }

En la biblioteca estándar de AIX, stdout pasa a ser una constante, pero es solo un detalle de implementación y no puede confiar en eso, ya que podría romperse en cualquier versión más nueva.

Pero no debe confiar en que stdout sea una variable (ni siquiera un valor l), porque también es un detalle de implementación en la biblioteca GCC.


Si no puede cambiar gran parte de su código, y solo necesita un truco de GCC para hacerlo compilable, puede intentar usar la extensión de atributo del constructor gcc.

Extracto de la documentación de gcc

6.31 Declaración de atributos de funciones

En GNU C, declaras ciertas cosas sobre las funciones llamadas en tu programa que ayudan al compilador a optimizar las llamadas a funciones y a revisar tu código con más cuidado.

La palabra clave __attribute__ le permite especificar atributos especiales al hacer una declaración. Esta palabra clave va seguida de una especificación de atributo entre paréntesis dobles. Los siguientes atributos están definidos actualmente para funciones en todos los destinos: ... , constructor , ...
...
El atributo constructor hace que la función se llame automáticamente antes de que la ejecución entre en main ()...

Así que podrías usar:

 #include <stdio.h> FILE * hw; void initHw(void) __attribute__((constructor)) { hw = stdout; } int main(void) { return 0; }

Pero CUIDADO : es una extensión gcc, lo que significa que su código no es correcto C.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda