Я работаю с библиотекой C ++, которая широко использует такие конструкции, как:
FILE *out_file1, *out_file2 ... *out_fileN;
//for some output files, but not all:
out_file1 = fopen( filename, "w" )
//later
if( out_file1 ) fprintf( ... )
if( out_file2 ) fprintf( ... )
Кажется, что это работает нормально под g ++ на OS X. Однако, когда я запускаю ее на linux, я получаю. ошибка сегментацияПроверяя код, out_file часто инициализируется ненулевыми значениями.
Я пытался добавить
out_file = NULL
, но это, похоже, не помогает - на самом деле, согласно отладчику, это не меняет значение out_file.
Может ли кто-нибудь помочь в следующем:
Является ли это признанным и разумным способом выполнения файлового ввода-вывода (т.е. с помощью файловых указателей в условных выражениях)
Почему значение указателя не установлено на ноль?
Как мне установить его на ноль?
Просто чтобы прояснить - я пытаюсь изменитьКодируй как можно меньше, так как я кодирую оболочку для чужой библиотеки.Таким образом, даже если общая структура является странным способом выполнения каких-либо действий, я бы предпочел найти обходной путь, который не изменит его, если это возможно.
РЕДАКТИРОВАТЬ: Поскольку это, кажется,Разумный, хотя и устаревший способ сделать условный ввод-вывод файла, я могу сузить область моего вопроса до вторых двух из трех, т.е.
class IO
{
private:
FILE* opFile
IO()
{
//At this point, opFile == 0x40
opFile = NULL; //At this point opFile is still 0x40
}
}
Так что, очевидно, если он выходит из конструктора сненулевое значение, что-нибудь вроде:
if( opFile ) fprintf( ... )
потерпит неудачу.Но как удается выйти из конструктора с ненулевым значением?
И в случае, если это помогает, это работает "как положено" в gcc на OSX, но не на g ++ - 4.3 или g ++4.4 в Ubuntu.