防止cin、cout、cerr被实例化

4
正如这个答案所述,当包含库时,由于创建了std::cinstd::coutstd::cerr等对象,因此占用了大量内存,导致二进制文件的大小大幅增加。
我经常为内存受限的嵌入式平台编译代码。在包含库后,二进制文件变得非常大以至于无法适应内部闪存。这反过来影响了可以包含的库,因为其中许多库都包含。一个例子是Protobuf库,因为它包含,所以我不能在多个项目中使用它。
对于那些运行在嵌入式平台上的目标,我不需要创建这些对象,因为我永远不会使用它们。问题是:我怎么能防止创建这些对象?或者是否有其他解决方法可以包含使用的库,并且不会使二进制文件大小增加太多?

3
不要包含 iostream - Ron
4
对于内存较小的嵌入式目标,通常可以更好地控制在调用 main 函数之前运行的启动和初始化代码。通常还会使用专门构建的库,禁用诸如 std::cout 等子系统(或者至少使这些对象变得更小且“空白”)。 - Some programmer dude
1
@MaxLanghof 不,该问题并没有问到那个。 你的“引用”在问题中根本没有出现。 虽然有类似的文本,但这不是OP正在提出的唯一问题(事实上有多个问题),Ron的评论完美地回答了主要问题。 捏造虚假引语来支持你的观点是不诚实的。 - Konrad Rudolph
1
根据您的平台,您可以在包含任何依赖于iostream的头文件之前添加例如#define _GLIBCXX_IOSTREAM 1(这样它就不会满足iostream头文件开头的#ifndef)。但是,您需要定义自己的虚拟版本来替代这些库所引用的任何内容。 - ChrisD
2
@KonradRudolph的建议就像是“我运行程序时它崩溃了”的水平一样-> “不要运行你的程序” - 这也是“回答了主要问题”,却没有信息。我的引用点是“包含使用iostream的库”,而不是对我来说无关紧要的“也许还有其他解决方法”或简洁的“有办法吗”的区别。这个引语绝对没有虚伪之处,只是缺少引用格式(为改写部分缺少[])。 - Max Langhof
显示剩余6条评论
1个回答

2
你无法用标准方法做到这一点,因为需要使用<iostream>来定义这些变量。如果你不想使用这些变量,那么你必须直接包含头文件(例如<ios><streambuf><istream><ostream>和/或<iosfwd>)。我假设你想要包含<iostream>以便使用这些头文件中定义的类。如果你使用的某些第三方库包含了你不想要的内容,则必须与该库的作者咨询,没有通用的答案。"最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接