我的生产代码的模型:
/* version 1 */
#include <stdio.h>
FILE** fout = &stdout;
int main() {
fprintf( *fout, "hello\n" );
}
在 gcc 下工作正常,但据报道在 mingw 下无法编译(需要左值作为一元“&”操作数)。
我见过设置 FILE* 是否等于 stdout 可移植? https://stackoverflow.com/q/12008516/1017348;我明白那个
/* 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
无论如何,与零进行比较是相当便宜的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)