У меня есть программа Windows C++, которая делает что-то вроде:
FILE* pf = ...; *stdout = *pf; // stdout is defined in stdio.h
Я ищу объяснение того, что происходит, когда вы меняете значение дескриптора файла stdout. Это просто способ перенаправления stdout?
-cr





Да, когда вы меняете stdout, вы эффективно перенаправляете его в другое место. Однако вы должны напрямую назначить нет для stdout вот так. Если вы хотите перенаправить stdout, вы должны вместо этого использовать freopen().
Вы никогда не должны напрямую манипулировать объектами FILE - вы должны рассматривать их как непрозрачные типы и взаимодействовать с ними только через функции в библиотеке <stdio>. Джонатан перечисляет несколько веских причин.
Из стандарта C99, раздел 7.19.3, параграф 6:
The address of the FILE object used to control a stream may be significant; a copy of a FILE object need not serve in place of the original.
Я не писал этот код. Это в некотором образце кода от поставщика набора инструментов.
Если вы измените stdout путем присвоения, а не с помощью назначенного инструмента (в C, freopen(), как сказал Адам Розенфилд - и, соответственно, в C++), то вы оставляете себя открытым для всех видов ответственности.
cout тоже будет перенаправлен.pf, вы несете ответственность за ошибки двойного восстановления (сбои).Гораздо лучше делать работу чисто.
(Демо-код не обязательно написан или даже тщательно изучен самыми опытными людьми из команды разработчиков. Если он выглядит сомнительным, это может быть потому, что это сомнительно.)
И самое главное, вы вызываете неопределенное поведение. Стандарт C очень четко указывает на тот факт, что использование копии FILE вместо оригинала вызывает UB, и я считаю, что стандарт C++ согласуется с C по этому поводу.
Я думал об этом в прошлом, и никогда не думал, потому что я тоже не нашел хорошего ответа