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

Key*_*Usr 0 c compilation use-case

想象一下,您不能或不想将编译器提供的任何库用作"标准",也不想使用任何外部库.您甚至不能使用编译器扩展(例如gcc扩展).

如果你删除C语言中很多人使用的所有东西当然是剩下的部分是什么?

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

首先,我想过sizeof()printf()(这些都在评论中已经明确-运营商+ stdio),所以......剩下?在线组装看起来也像是一个扩展,所以如果我是对的话,甚至可以选择使用 C组装.

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

int main() {
    // replace_me
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

除了"无聊"类型的数学和从类型到类型的转换之外,我还可以调用什么呢?

需要注意的是switch,goto,if,循环和其它结构是什么也不做,只允许重复的一段代码不是我要找的(如果不是明显)的东西.


(希望编辑澄清wtf我实际上是在询问,但Matteo的回答几乎是这样做的.)

Mat*_*lia 7

如果删除所有库本质上你有一些类似于C 的独立实现(它仍然需要提供一些库 - 比如,string.h,但这不是你在便携式C中不能轻易实现的),这就是正常的首先是编程微控制器和其他没有现成操作系统的计算机 - 以及编译操作系统时通常使用的操作系统编写者.

除了"原始"计算之外,你通常有两种做事方式:

  • 装配块(你可以在底层机器上做任何事情);
  • 内存映射IO(您设置volatile指向某些硬件相关位置的指针并从中读取/写入;这会影响硬件内容).

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

再说一遍,你自己无法实现.但是,拥有一个标准库的目的是避免不断重新发明轮子,并拥有一套便携式功能,使您不必重新知道每个目标平台的细节.


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