【发布时间】:2017-06-02 07:56:16
【问题描述】:
来自 Ubuntu 手册页 stdin(3):
extern FILE *stdout;
来自 mingw64 stdio.h 文件:
#define stdout (&__iob_func()[1])
两者都表明stdout(指针)的值不能假定为常量。
我还能依靠这样的东西来工作吗:
FILE * stream;
// early after startup
stream = stdout;
// much later, far down the stack, in a different function
fprintf(stream, "%s", "fprintf(stream, \"");
【问题讨论】:
-
您想使用示例中的代码解决的实际问题是什么?你为什么要问?能详细点吗?
-
footnote 272) freopen 函数的主要用途是更改与标准文本流(stderr、stdin 或 stdout)关联的文件,因为这些标识符不需要是可修改的左值以fopen 函数返回的值可以被赋值。
-
出于所有实际目的,是的。它们是与
STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO(0, 1, 2) 关联的流。话虽如此,它们可以是dup()和dup2(),并重新分配。如果没有重复或重新分配等。那么常量和相关的流是常量。这意味着,除非您已重新分配等,否则您可以从文件描述符0读取并写入文件描述符1 & 2并且始终为stdin、stdout和stderr- 除非您更改它们。 -
有个东西叫重定向。因此,在第二行之后,如果某个程序或计算机用户将标准输出重定向到其他地方,您的第三行输出仍将打印到前一个标准输出。例如最初标准输出是终端。后来它被重定向到一个文件(一些日志文件)。然后 fprintf 将打印到终端而不是日志文件。
-
@BLUEPIX 是的,在 mingw64 中,它是一个扩展为右值表达式的宏。问题是:该表达式是否总是相同的值?