`stdin`、`stdout`和`stderr`的值可以假定为恒定吗?

3

来自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, \"");

2
你想通过像你的例子中的代码解决什么实际问题?为什么这么问?能否详细说明一下? - Some programmer dude
1
脚注272)freopen函数的主要用途是更改与标准文本流(stderr、stdin或stdout)相关联的文件,因为这些标识符不需要可修改的lvalue,可以将fopen函数返回的值分配给它们。 - BLUEPIXY
2
就实际目的而言,是的。它们是与 STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO (0, 1, 2) 相关联的流。话虽如此,它们可以通过 dup()dup2() 进行复制和重新分配。如果没有进行复制或重新分配等操作,则常量和相关流是恒定的。这意味着,除非您重新分配等操作,否则可以从文件描述符 0 中读取,并将其写入文件描述符 12,并且始终是 stdinstdoutstderr -- 除非您更改它们。 - David C. Rankin
有一种东西叫做重定向。所以在第二行之后,如果某个程序或计算机用户将stdout重定向到其他地方,您的第三行输出仍将打印到以前的stdout上。例如,最初的stdout是终端。然后它被重定向到一个文件(一些日志文件)。那么fprintf将打印到终端而不是日志文件。 - Zhigang An
@Some programmer dude 我想设置一个全局变量,以便其他函数知道在哪里fprintf。stdout的值被用作句柄。我想知道这个句柄是否永久有效。(相比之下,函数指针永久有效。至少如果你不将其dlclose()释放出内存。) - not-a-user
显示剩余5条评论
1个回答

2
这是C11标准(§7.21.1-3)的内容(我强调的):
stderr、stdin和stdout是类型为“指向FILE的指针”的表达式,分别指向与标准错误、输入和输出流相关联的FILE对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接