如果这是一个主观或重复的问题,我深表歉意.搜索起来有点尴尬,所以我不确定要包含哪些术语.

我想知道的是,当你不包括像stdiostdlib这样的标准库时,C中的基本基础工具/函数是什么.

如果没有printf()fopen()等,我该怎么办呢?

另外,从技术上讲,这些库是"C"语言的一部分,还是仅仅是非常有用和有效的必需库?

推荐答案

C标准是这样说的(5.1.2.3/5):

对一致性的最低要求 实施情况包括:

-在顺序点,易失性对象 在某种意义上是稳定的,即以前的 访问是完成的,并且是后续访问 尚未发生访问.

-程序终止时,所有数据

-系统的输入和输出动态

因此,如果没有标准的库函数,程序唯一能保证的行为就是与易失性对象的值有关,因为你不能使用任何保证的文件访问或"交互式设备"."纯C"仅通过标准库函数提供交互.

不过,纯C语言并不是问题的全部,因为您的硬件可能有特定的地址,这些地址在读取或写入时会执行特定的操作(无论是SATA或PCI总线、原始视频内存、串行端口、要发出蜂鸣音的东西,还是闪烁的LED).所以,knowing something about your hardware,你可以用C语言写很多东西,而不需要使用标准库函数.您可以潜在地实现C标准库,尽管这可能需要访问特殊的CPU指令和特殊的内存地址.

但是在纯C中,没有扩展,删除了标准库函数,除了读取命令行参数、做一些工作并从main返回状态码之外,基本上不能做任何事情.这不是不屑一顾的,它仍然是受资源限制的图灵完全的,尽管你唯一的资源是自动的和静电变量,没有堆分配.它不是一个非常丰富的编程环境.

标准库是C语言规范的一部分,但在任何语言中,都会在语言"本身"和库之间划出一条线.这是一个概念上的差异,但最终在原则上并不是一个非常重要的差异,因为标准说它们是结合在一起的.任何从事非标准工作的人都可以像库一样轻松地删除语言功能.不管怎样,结果都不是C的一致性实现.

请注意,C的"独立"实现只需实现标准的子集,包括不包括任何I/O,因此您处于我上面描述的位置,依赖于特定于硬件的扩展来完成任何有趣的事情.如果您想根据标准来区分"核心语言"和"库",那么这可能是一个划清界限的好地方.

C++相关问答推荐

如何在Switch和case中发出有关enum类型不匹配的编译器警告?

在严格的C89模式下,收件箱不会在' uint64_t '上发出警告

根据工具链文件中的定义替换单个函数定义

如何将匿名VLA分配给指针?

如何使用Python C API实现多线程程序?

Malloc(sizeof(char[Length]))是否不正确?

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

N的值设置为0或1(未定义的行为),而我正在try 学习realloc和Malloc的用法

在C++中访问双指针

为什么中断函数会以这种方式影响数组?

在移动数组元素时获得意外输出

如何在POSIX-UEFI中获得输入?

如何在GDB中查看MUSL的源代码

为什么未初始化的 struct 的数组从另一个数组获取值?

Makefile无法将代码刷新到ATmega328p

在Ubuntu上使用库部署C程序的最佳实践

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

如何用用户输入的多个字符串填充数组?

使用共享变量同步多线程 C 中的函数

free后内存泄漏?