是否可以在链接C++程序时将C++标准库替换为C标准库?

Is it possible to replace C++ standard library with C standard library when linking C++ programs?

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

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

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

Is it possible to replace C++ standard library with C standard library when linking C++ programs?

不,这是不可能的。通常,C++ 标准库是在 C 接口之上实现的。你必须 link 两者兼顾。

Would it be possible to compile the program as a C++ program (using e.g., g++) but link the program with the C standard library (e.g., libc) instead of the C++ standard library (e.g., libstdc++) ?

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

gcc file.cpp

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

target system has low memory (e.g., an embedded system) where the C++ stdlib would be too big for the available memory.

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

would replacing the C++ stdlib with the C stdlib solves the issue and

不,C++ stdlib 和 C stdlib 是不同的东西。

allows these people to use C++ language features (namespace, more type safety, etc.) at no cost ?

无论如何都不禁止。

Why aren't today's C programmers doing this?

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