gpt4 book ai didi

c - 如何将 FILE** 变量设置为标准输出?

转载 作者:太空狗 更新时间:2023-10-29 17:07:13 26 4
gpt4 key购买 nike

我的生产代码模型:

/* version 1 */
#include <stdio.h>
FILE** fout = &stdout;
int main() {
fprintf( *fout, "hello\n" );
}

在 gcc 下工作正常,但据报道无法在 mingw 下编译(需要左值作为一元“&”操作数)。

我看过Is setting a FILE* equal to stdout portable? ;我明白了

/* version 2 */
#include <stdio.h>
int main() {
FILE* fout = stdout;
fprintf( fout, "hello\n" );
}

将是完全有效的。但是,我需要预设一个全局变量。不幸的是,

/* version 3 */
#include <stdio.h>
FILE* fout = stdout;
int main() {
fprintf( fout, "hello\n" );
}

不适合替代版本1;它甚至不能在 gcc 下编译(第 2 行:初始化元素不是常量)。

知道如何将 stdout 放入在 main() 启动之前初始化的变量中吗?

最佳答案

在 Linux (glibc) 中,stdout 定义如下:

extern struct _IO_FILE *stdout;

所以,你可以用它做任何你想做的事情。

但是,在 MinGW 上,stdout 是这样定义的,在 stdio.h 中:

#define stdout  (&_iob[STDOUT_FILENO])

唉,这不是你可以获取地址的东西,而且,正如你发现的,它不是你可以在全局初始化器中使用的东西。 :-(

问题的根源在于 C 标准规定这些应该是宏,这意味着任何可移植程序都不应该对内部内容做任何假设。因此,恐怕没有简单的方法可以避免以编程方式读取 stdout。这就是为什么许多库需要一个必须在执行任何其他操作之前调用的 lib_initialize() 函数。

C++ 确实允许全局变量的构造函数,并且这些构造函数会在 main 之前自动调用,即使对于库也是如此。使用 gcc 可以破解 C 程序来做同样的事情,但这是一个邪恶的把戏,我不记得如何做到这一点。

我会这样做:

#include <stdio.h>
FILE* fout = NULL;

int my_library_function() {
if (!fout)
fout = stdout;
fprintf( fout, "hello\n" );
}

这不是一个大的效率问题:无论如何您都必须加载 fout,并且与零进行比较非常便宜。

关于c - 如何将 FILE** 变量设置为标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18505530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com