C 将标准输出分配给文件*

C 将标准输出分配给文件*,c,stdout,C,Stdout,作为小型C程序中全局范围的代码,我有: FILE *outFile = stdout; 这是因为我希望将stdout作为输出的默认目标,但允许用户在命令行上指定一个不同的目标(尽管我知道他们可以重定向我想要的皮带和支架) 这无法编译: xmlheap.c:15:17: error: initializer element is not a compile-time constant FILE *outFile = stdout; ^~~~~~ /usr/include/

作为小型C程序中全局范围的代码,我有:

FILE *outFile = stdout;
这是因为我希望将
stdout
作为输出的默认目标,但允许用户在命令行上指定一个不同的目标(尽管我知道他们可以重定向我想要的皮带和支架)

这无法编译:

xmlheap.c:15:17: error: initializer element is not a compile-time constant
FILE *outFile = stdout;
            ^~~~~~
/usr/include/stdio.h:215:16: note: expanded from macro 'stdout'
#define stdout  __stdoutp

这不可能吗?

C中的静态初始值设定项必须是编译时常量。由于不需要设置标准输出,因此必须在动态程序执行中初始化全局变量:

#include <stdio.h>

FILE * outFile;

int main(void)
{
    outFile = stdout;

    /* ... */
}
#包括
文件*输出文件;
内部主(空)
{
outFile=stdout;
/* ... */
}

(特别是(参见C117.21.1/3),
stdout
被指定为一个宏,该宏扩展为指向
文件的“类型表达式”指针)。

使用
fdopen

   FILE *outFile = fdopen(1, "w");

为什么不在
main
的早期阶段将此作为一项作业来完成呢?您能对您的答案进行一点扩展吗?例如,您可以描述函数参数的含义以及它们如何实现对
stdout
的赋值。函数的返回值也不是编译时常量。@因此,我认为
stdout
也不是编译时常量。@metacubed我认为这是不必要的,因为函数非常常见:是,这是OP的问题。