Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

448
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!