проблема с файлом - PullRequest
       34

проблема с файлом

1 голос
/ 16 января 2009

Я получаю следующую ошибку для приведенного ниже кода, «1506-221 (S) Инициализатор должен быть допустимым константным выражением»

FILE          *fp[] = {stdout, dump_f};

это приемлемо? Как правильно добиться этого?

Ответы [ 4 ]

4 голосов
/ 16 января 2009

Ошибка предполагает, что в вашей системе переменная stdout на самом деле является макросом #defined, который расширяется до вызова функции.

На самом деле, как и предполагали другие, возможно, просто stdout является объявленной extern-переменной, значение которой неизвестно во время компиляции и поэтому не может быть предоставлено в статическом инициализаторе.

Независимо от того, решение должно быть одинаковым - я бы попробовал что-то вроде:

FILE *fp[2];

void init_fp()
{
    fp[0] = stdout;
    fp[1] = dump_f;
}
2 голосов
/ 16 января 2009

Обычно в большинстве систем Unix stdout определяется как что-то вроде (&_iob[1]), что сводится к допустимому константному выражению; Солярис, например, до сих пор.

Несколько лет назад библиотека GNU C изменила свое определение stdout на нечто, не являющееся константой, поэтому старый код, который использовался для инициализации переменных FILE * для любых стандартных файловых указателей, перестал компилироваться. , Это санкционировано стандартом C, поэтому нет никаких оснований для жалоб. Вы просто должны признать, что вы не можете инициализировать статические файловые указатели на один из стандартных каналов ввода-вывода и перекодировать, чтобы обойти проблему. (Но это это все еще неприятность.)

2 голосов
/ 16 января 2009

Скорее всего, stdout и / или dump_f - это макросы или (более вероятно, проблема) внешние глобальные переменные.

Если у меня есть этот код:

// external.c
int hello = 1234;

// external.h
extern int hello;

// main.c
#include "external.h"

int world = hello; // error!

В указанной строке вы получите сообщение об ошибке, поскольку значение hello неизвестно.

stdout и dump_f, скорее всего, объявлены как extern глобальные переменные, например:

extern FILE *stdout, *stdin, *stderr, *dump_f;
2 голосов
/ 16 января 2009

Если это глобальное значение, то C не поддерживает инициализацию его с помощью вызова функции. Если stdout является макросом (как предлагалось изначально) для вызова функции, то вы не сможете использовать его для инициализации глобального.

...