我有一个 Windows C++ 程序正在执行以下操作:
文件* pf = ...; *标准输出= *pf;// stdout 在 stdio.h 中定义
我正在寻找有关更改标准输出文件句柄的值时会发生什么的解释。这只是重定向标准输出的一种方式吗?
-cr
我有一个 Windows C++ 程序正在执行以下操作:
文件* pf = ...; *标准输出= *pf;// stdout 在 stdio.h 中定义
我正在寻找有关更改标准输出文件句柄的值时会发生什么的解释。这只是重定向标准输出的一种方式吗?
-cr
是的,当您更改标准输出时,您实际上是在将其重定向到其他地方。但是,您不应该像那样直接分配给标准输出。如果你想重定向标准输出,你应该使用freopen()
.
您永远不应该直接操作 FILE 对象 - 您应该将它们视为不透明类型,并且只能通过<stdio>
库中的函数与它们交互。乔纳森列出了一些很好的理由。
来自 C99 标准,第 7.19.3 节,第 6 段:
用于控制流的 FILE 对象的地址可能很重要;FILE 对象的副本不需要代替原始对象。
如果您stdout
通过分配而不是使用指定的工具进行更改(在 C 中,freopen()
正如 Adam Rosenfield 所说 - 并且通过扩展,在 C++ 中),那么您会让自己承担各种责任。
cout
是否也会被重定向。pf
,那么您将对双重错误(崩溃)负责。干净地完成工作要好得多。
(演示代码不一定是由供应商编码团队中最有经验的人编写或审查的。如果它看起来很可疑,那可能是因为它很可疑。)