Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

449
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda