Pergunta
Estou recebendo o erro folowing para o código abaixo, "1506-221 (S) Initializer deve ser uma expressão constante válido"
FILE *fp[] = {stdout, dump_f};
isso é aceitável? o que é a maneira correta para obter este?
Solução
O erro sugere que em seu sistema a variável stdout
é na verdade uma macro #defined
que se expande para uma chamada de função.
Na verdade, como já foi sugerido, é provavelmente apenas que stdout
é um extern declarou variável cujo valor não é conhecido em tempo de compilação e, portanto, não podem ser fornecidos em um inicializador estático.
Independentemente de qual, a solução deve ser o mesmo - eu tentaria algo como:
FILE *fp[2];
void init_fp()
{
fp[0] = stdout;
fp[1] = dump_f;
}
Outras dicas
Mais do que provável, stdout
e / ou dump_f
são macros ou (mais provável que o problema) globals externos.
Se eu tenho este código:
// external.c
int hello = 1234;
// external.h
extern int hello;
// main.c
#include "external.h"
int world = hello; // error!
Você receberia um erro na linha indicada porque o valor da hello
não é conhecido.
stdout
e dump_f
são provavelmente declarada como globals extern
, assim:
extern FILE *stdout, *stdin, *stderr, *dump_f;
Classicamente, a maioria dos sistemas Unix usados ??para definir stdout
como algo como (&_iob[1])
, o que reduziu a uma expressão constante válido; Solaris, por exemplo, ainda o faz.
Há alguns anos atrás, agora, a Biblioteca C GNU mudou sua definição de stdout
a algo que não era uma constante, então o código antigo, que usado para inicializar variáveis ??FILE *
a qualquer um dos ponteiros de arquivo padrão deixou de compilar. Esta é sancionada pelo padrão C, de modo que não há virtude em reclamar. Você simplesmente tem que aceitar que você não pode ponteiros de arquivo inicializar estáticas para um dos canais de I / O padrão e recode para contornar o problema. (Mas é ainda um incômodo.)
Se isso é um global, então C não suporta inicializando-lo com uma chamada de função. Se stdout
é uma macro (como sugerido inicialmente) para uma chamada de função, então você não será capaz de usá-lo para inicializar um global.