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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top