c - 如果我排除库和编译器扩展,C 中还剩下什么?

标签 c compilation use-case

想象一下这样一种情况,您不能或不想使用编译器提供的任何库作为“标准”,也不能使用任何外部库。您甚至不能使用编译器扩展(例如 gcc extensions )。

如果将 C 语言中许多人理所当然使用的所有东西剥离,您得到的剩余部分是什么?

以这种方式,开箱即用的任何大型 C 编译器(不仅是 ANSI C)支持的每个可调用函数的列表可能作为答案令人满意,因为它至少大致显示了用例的语言。

首先我想到了 sizeof()printf()(那些已经在评论中阐明了 - operator + stdio),所以... 剩下什么? In-line assembly看起来也像是一个扩展,所以如果我是对的,那几乎连使用 C 程序集的选项都没有了。

可能在代码方面它更容易理解。想象一下仅使用例如编译的代码gcc main.c(允许输出标志)没有#include,也没有extern

int main() {
    // replace_me
    return 0;
}

除了“无聊”的类型数学和从一个类型转换到另一个类型之外,我还能调用什么来实际做一些其他事情?

请注意,switchgotoif、循环和其他不执行任何操作且只允许重复一段代码的构造不是我正在寻找的东西(如果它不明显的话)。


(希望编辑澄清了我实际上要问的 wtf,但 Matteo 的回答几乎做到了。)

最佳答案

如果你删除所有的库,基本上你有一些类似于 C 的独立实现的东西(它仍然必须提供一些库 - 比如 string.h,但这不是你不能轻易实现的你自己在可移植 C 中),这通常是你在为没有现成操作系统的微 Controller 和其他计算机编程时开始的 - 以及操作系统编写者在编译他们的操作系统时通常使用的。

除了“原始”计算之外,您通常有两种处理方式:

  • 组装 block (您可以在这里做任何底层机器可以做的事);
  • 内存映射 IO(您将 volatile 指针设置为某个硬件相关位置并从中读/写;这会影响硬件)。

这就是构建任何东西所需的全部 - 毕竟,无论如何,这一切都归结为这些东西,常规托管实现的 C 库通常是用 C 本身编写的,一些程序集用于速度或通信使用操作系统1(通常系统调用是通过某种中断调用的)。

再说一遍,没有什么是您自己无法实现的。但是拥有标准库的意义在于既可以避免不断地重新发明轮子,又可以拥有一组可移植功能,让您不必在了解每个目标平台的细节后重写所有内容。


  1. 反过来,主流操作系统通常也是用混合语言或 C 语言和汇编语言编写的。

关于c - 如果我排除库和编译器扩展,C 中还剩下什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42637085/

相关文章:

c++ - libxml2 XPATH - 从 XML 中选择数据子集

c - 退出多线程程序中的所有线程

c - StringICompare 与 char 指针不起作用

c++ - makefile的正确使用

c# - Clean Architecture 中的 'Use Case Interactor' 和 'Service' 有什么区别?

c++ - C rand() 并不是真正随机的

c++ - 枚举值的编译器支持

mysql - sql fiddle 可以处理的内容有限制吗? sql fiddle 不编译任何东西并且不返回任何错误消息

unit-testing - 软件任务/项目规划书籍?

coding-style - 是否可以在代码库中嵌入 Cockburn 风格的文本 UML 用例内容以提高代码可读性?