【问题标题】:Can the values of `stdin`, `stdout`, and `stderr` be assumed to be constant?`stdin`、`stdout` 和 `stderr` 的值可以假设为常数吗?
【发布时间】: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_FILENOSTDOUT_FILENOSTDERR_FILENO (0, 1, 2) 关联的流。话虽如此,它们可以是dup()dup2(),并重新分配。如果没有重复或重新分配等。那么常量和相关的流是常量。这意味着,除非您已重新分配等,否则您可以从文件描述符 0 读取并写入文件描述符 1 & 2 并且始终为 stdinstdoutstderr - 除非您更改它们。
  • 有个东西叫重定向。因此,在第二行之后,如果某个程序或计算机用户将标准输出重定向到其他地方,您的第三行输出仍将打印到前一个标准输出。例如最初标准输出是终端。后来它被重定向到一个文件(一些日志文件)。然后 fprintf 将打印到终端而不是日志文件。
  • @BLUEPIX 是的,在 mingw64 中,它是一个扩展为右值表达式的宏。问题是:该表达式是否总是相同的值?

标签: c stdio


【解决方案1】:

这就是 C11 标准所说的(§7.21.1-3)(我自己的口音):

标准错误
标准输入
标准输出
它们是“pointer to FILE”类型的表达式,分别指向与标准相关联的 FILE 对象 错误、输入和输出流。

【讨论】:

    猜你喜欢
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    相关资源
    最近更新 更多