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

2023-12-24

我的生产代码的模型:

/* 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(使用前将#替换为@)

如何将 FILE** 变量设置为标准输出? 的相关文章

随机推荐

  • 在 O(nlog(n)) 中查找“最大”重叠间隔对

    问题陈述 Inputn 个间隔的集合 s 1 t 1 s 2 t 2 s n t n Output一对间隔 s i t i s j t j 其中maximum所有区间对之间重叠 Example 输入区间 1 10 2 6 3 15 5 9
  • 如何为“扩展类”编写有意义的测试?

    编写有意义的测试的正确方法是什么扩展一个类 https dart dev guides language language tour extending a class与super关键词 class FooBase
  • Android 相机 takePicture 使用预览小缓冲区

    我正在使用 OPENCV 开发一个项目 我在 onCameraFrame 上有一些进程 当它显示预览时 用户可以拍照 但在某些设备中 我在调用 takePicture 方法后出现错误 我应该怎么办 E Camera JNI 11783 Ma
  • 我如何知道短信是否已到达 Twilio 中的目的地

    我正在开发一个网络应用程序 并且我正在使用 twilio 网关发送短信 我需要在我的页面上显示短信的状态 如果短信已发送 那么它将显示已发送 否则它将显示待处理 所以请告诉我如何知道消息是否已送达 以下是示例代码 public class
  • 如何提供一个后备程序集而不是无法加载的程序集?

    在运行时 如果引用的程序集无法加载 例如 强名称验证失败 因为它是测试签名的 有没有办法从另一个真实签名的路径提供替换程序集 我尝试订阅 AppDomain CurrentDomain AssemblyResolve 但它没有被触发 因为
  • 如何在Python 3中将二进制文件转换为列表中的文本文件?

    我正在尝试编写一个 Python 程序 该程序从 LabView 中获取多个二进制文件 从 tkinter 对话框中选择并打开 并将它们转换为可读的文本文件 或 csv 文件 理想情况下 但是 我在二进制到文本转换方面遇到了麻烦 我尝试查看
  • 如何快速比较颜色

    我正在尝试比较颜色 但无法使用isEqual方法 因为我正在尝试比较背景的颜色UICollectionViewCell 在这种情况下比较颜色的正确方法是什么 if cell layer backgroundColor UIColor red
  • 显示旋转轮图像直到整个页面加载

    我正在使用下面的代码 在布局页面的 body 标签内 div img src images user profile ajax loading gif alt Loading div 在起始页中 css div loading height
  • 如何使用 C++ 更改、替换或删除文本文件中的行?

    如何使用 C 更改 替换或删除文本文件中的行 我有一个文本文件 其中包含用户的登录信息 用户名和密码 例如 file Jimmy jim1236 tom tommy545 现在我怎样才能编写一个程序 允许用户在登录系统后更改自己的密码呢 我
  • 使用 csv.reader 的制表符分隔文件未分隔我期望的位置

    我正在尝试使用 Python 循环遍历选举结果的制表符分隔文件 以下代码不起作用 但是当我使用具有相同结果的本地文件 注释掉的行 时 它确实按预期工作 我唯一能想到的是我需要传递网址的一些标头或内容类型 但我无法弄清楚 为什么会发生这种情况
  • 获取 Google BigQuery 中给定月份的总天数?

    我可以创造用户定义函数 https cloud google com bigquery user defined functions并计算给定月份的总天数 有没有直接的方法来获取给定日期的给定月份中的总天数 eg select date t
  • 使用 PIL 时释放内存

    我正在使用 PIL Python 图像库 编辑图像 每一步 转换 旋转 调整大小 都会创建更多图像 文档摘录 返回旋转给定度数的图像的副本 所以我想释放内存 你知道下面的做法是否节省内存 import PIL Image image PIL
  • Socket.io 在两个 Node.js 应用程序之间触发事件?

    我有两台服务器 一台用于后端应用程序 另一台为前端服务 它们是抽象的 但共享相同的数据库 我需要两者使用 socket io 在彼此之间进行实时事件通信 前端 serves a front end website var appPort 9
  • 如何在列上添加隐藏属性?

    创建时态表时 我们需要定义开始和结束日期时间列 这可以是hidden 不可见于SELECT or INSERT without columns 我想再添加一列 其中包含有关已提交更改的用户的信息 问题是 我收到以下错误 Msg 13735
  • 避免在 selenium 调用期间打开远程服务器上的浏览器

    我使用 webdriver 编写了一个 Selenium 应用程序 我希望在远程服务器上运行它 当我通过 putty 以及 Xming 登录服务器来做到这一点时 selenium 会尝试仅在服务器上打开浏览器并通过外部显示器加载页面 然而
  • 使用 lucene 提取 tf-idf 向量

    我已经使用 lucene 索引了一组文档 我还为每个文档内容存储了 DocumentTermVector 我编写了一个程序并获取每个文档的词频向量 但是如何获取每个文档的 tf idf 向量 这是我的代码 用于输出每个文档中的术语频率 Di
  • 传递箭头函数与传递函数

    假设我有一个函数 handleChange e gt this setState e target id e target value 以下内容有什么区别 1
  • 在 JavaFX 中实现标签栏

    答案示范 5月29日凌晨3点10分回答 10 7 2016 you can find the code on GitHub https github com goxr3plus JavaFX TagsBar 回答前的实际问题 5月22日19
  • 下载图像,其src属性(base64)

    通过 AJAX 我收到一个 base64 格式的图像 我将其附加到 img 标签的 src 属性 我想提供一个下载该图像的选项 是否可以获取 src 属性的数据并下载它 这是因为我无法再次从服务器下载图像 谢谢 只需设置window loc
  • 如何将 FILE** 变量设置为标准输出?

    我的生产代码的模型 version 1 include