【问题标题】:Is it possible to replace C++ standard library with C standard library when linking C++ programs?链接 C++ 程序时,是否可以用 C 标准库替换 C++ 标准库?
【发布时间】:2021-10-27 18:34:03
【问题描述】:

我有两个相关的问题,一个是出于好奇的理论问题,另一个是询问可能的用例。

(1) 是否可以编译 C++ 程序(使用例如 g++)但将程序与 C 标准库(例如 libc)而不是 C++ 标准库(例如 libstdc++)链接?我知道 C++ 标准库包含 C 标准库,但我要求一种方法来保留 C 库。我知道可以删除带有-nostdlib 标志的标准库,但我想只删除标准库的“C++ 部分”并保留“C 部分”。

(2) 据我所知,有些人仍然使用 C 而不是 C++ 的一个原因是当目标系统内存不足时(例如,嵌入式系统),而 C++ 标准库对于可用内存来说太大了.在这种情况下,用 C 标准库替换 C++ 标准库会解决问题并允许这些人免费使用 C++ 语言特性(命名空间、更多类型安全等)吗?如果可能,会有缺点吗?为什么今天的 C 程序员不这样做?

【问题讨论】:

  • 您必须重写所有 .h 文件以将所有函数声明为 extern "C"
  • 第 2 点不相关。嵌入式系统程序员知道如何在资源匮乏的环境中使用 C++。还有更重要的问题 - 例如动态内存分配(应该避免,许多标准禁止它)在使用 C++ 进行 uC 编程时必须解决。这是可行的 - arguino 是最好的例子
  • 我不明白。您不能以任何方式“用 C stdlib 替换 C++ stdlib”。这些是不同的东西。
  • 在我的店里,人们不使用 C++ 的主要原因是他们不懂 C++(obj.method() 格式对他们来说是陌生的)。我很难让他们切换到 C++ 只是为了使用引用和 bool 类型。 :-(
  • 有人真的了解 C++ 吗?

标签: c++ c linker g++


【解决方案1】:

链接C++程序时,是否可以用C标准库替换C++标准库?

不,这是不可能的。通常,C++ 标准库是在 C 接口之上实现的。您必须同时链接两者。

是否可以将程序编译为 C++ 程序(使用例如 g++)但将程序与 C 标准库(例如 libc)而不是 C++ 标准库(例如 libstdc++)链接?

不是“替代”,而只是“没有”C++ 标准库。只需使用gcc

gcc file.cpp

基本上,g++gcc 的区别在于g++ 与C++ 标准库链接。检查 gcc -vg++ -v 详细输出。

目标系统内存不足(例如嵌入式系统),其中 C++ 标准库对于可用内存来说太大了。

具体来说,std::cout(即std::ostream)很重,因为缓冲和对std::iomanip 内容的全面支持。在大多数情况下,std::cout 没有针对嵌入式(较小的尺寸)进行优化,例如 printf 就是这样。异常被避免或根本不使用,因为它们是如何实现的——速度第一,不考虑大小。在嵌入式中,您通常使用 C++。非常大的 MBed 和 Arduino 都是 C++ 在裸机世界中的突出例子。

用 C 标准库替换 C++ 标准库可以解决问题并且

不,C++ 标准库和 C 标准库是不同的东西。

允许这些人免费使用 C++ 语言特性(命名空间、更多类型安全等)?

没有任何禁止。

为什么今天的 C 程序员不这样做?

为什么 C++ 程序员不用 Rust 或 Java 编写代码?很可能是因为他们喜欢自己喜欢的编程语言。

【讨论】:

  • 感谢您的回答。所以可以肯定的是,这意味着如果我使用 C++ 语言功能,但从不使用 #include 任何 C++ stdlib 标头,我可以使用 gcc 而不是 g++ 进行编译,并且我确信 (1) 程序将即使我使用 C++ 功能并且 (2) 只有 libc 将包含在我的可执行文件中,也可以在没有警告的情况下编译,对吗?
  • but never #include 不,#include 只包含一个文件,它是无关的。具体来说,如果您从不使用 libstdc++.so 中的 symbols。您可以在任何地方声明一个函数,而不是专门从#include 声明。您可以包含文件,也可以有模板instatations,并使用标题中定义的函数等。使用的符号很重要。 the program will compile without warnings 好吧,这与使用 C++ 无关,取决于您如何编写程序,only libc will be included in my executable 以及“仅”crt0 和其他一些初始化内容。
  • 基本上听起来像freestanding environment,但这是不同的东西,但可能对你来说很有趣。就像“嵌入式 C++”,EC++.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 2020-01-07
  • 2012-02-24
  • 1970-01-01
相关资源
最近更新 更多