El elemento inicializador de error no es constante

Estoy teniendo problemas con mi código, y no puedo resolver …

el fragmento de código donde se informa el error:

static FILE *debugOut = stderr; static FILE *infoOut = stdout; 

El error que devuelve el gcc es:

 initializer element is not constant 

El estándar ANSI C no exige que stderr / stdout tengan que ser expresiones constantes.

Así, dependiendo del código de biblioteca C estándar usado como este

 static FILE *debugOut = stderr; 

comstack o muestra el mensaje de error que ha preguntado.

Por ejemplo, la biblioteca GNU C define stderr / stdout / stdin como expresiones no constantes.

Básicamente, tiene dos opciones para hacer frente a esta situación, es decir, hacer que dicho código sea portátil.

Inicialización desde main

 static FILE *debugOut = NULL; static FILE *infoOut = NULL; int main(int argc, char **argv) { debugOut = stderr; infoOut = stdout; // [..] return 0; } 

Inicialización desde una función constructora.

En muchas plataformas puede declarar una función como constructor, lo que significa que se llama en el inicio antes de llamar a main() . Por ejemplo, cuando usas GCC puedes implementarlo así:

 static FILE *debugOut = NULL; static FILE *infoOut = NULL; static void init_streams(void) __attribute__((constructor)); static void init_streams(void) { debugOut = stderr; infoOut = stdout; } 

Esta syntax de atributo de constructor no está estandarizada, pero como GCC está muy extendido y otros comstackdores se esfuerzan por la compatibilidad de GCC, esto es en realidad bastante portátil.

En caso de que necesite hacer este portátil a otros comstackdores que no tengan una característica de statement similar, puede guardar este código con macros como __GNU_LIBRARY__ y / o __GNUC__ .

Intenta hacerlo en main por ejemplo:

 static FILE *debugOut; static FILE *infoOut; main(){ debugOut = stderr; infoOut = stdout; } 

De la norma C99:

6.7.8 Inicialización

Restricciones

4 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.

Por lo tanto,

 static FILE *debugOut = stderr; static FILE *infoOut = stdout; 

no es un código legal si el comstackdor no cree que stderr y stdout sean expresiones constantes.

Esto es lo que el estándar tiene que decir sobre stderr y stdout .

7.19 Entrada / salida

7.19.1 Introducción

  stderr stdin stdout 

que son expresiones de tipo “puntero a FILE ” que apuntan a los objetos de FILE asociados, respectivamente, con el error estándar, la entrada y las secuencias de salida.

Solución

La manera estándar de resolver esto es inicializar las variables a NULL y establecer sus valores en main .

 static FILE *debugOut = NULL; static FILE *infoOut = NULL; int main() { debugOut = stderr; infoOut = stdout; ...