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.
static FILE *debugOut = NULL; static FILE *infoOut = NULL; int main(int argc, char **argv) { debugOut = stderr; infoOut = stdout; // [..] return 0; }
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 deFILE
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; ...