没有C标准库的C程序。如何?

时间:2014-10-27 15:58:53

标签: c

我需要用C语言编写一些软件,而不使用在该环境中既不可用也不可行的“C标准库”。 我仍然需要读写文件和套接字。 怎么样?

1 个答案:

答案 0 :(得分:1)

Stricto sensu,一个不使用标准库的可移植(托管)C99程序甚至无法进行任何输入/输出,或者可能产生任何可观察到的副作用。而且你甚至无法在堆中分配任何数据(如malloc那样)。 BTW任何C99托管实现都需要一个libc;你想要一个C的独立库(根据定义,它将是"特定于实现&#34 ;;实际上它可以以特定于实现的方式使用特定于OS的服务。另请参阅this)。

在旧Linux(以及IIRC,SVR4,例如SunOS 5)上,曾经有一些libsys仅与syscalls(2)接口。 AFAIK,它已被弃用,我找不到它。

一些库(如来自GTK的Glib,....)提供了大多数标准C库函数(但它们期望一些libc,即托管POSIX系统)。

请注意,您可以考虑使用musl-libc,也许删除您不想要的功能。您还可以考虑使用一些提供标准子集的libc,例如: dietlibc。另见C standard library上的wikipage。

顺便说一下,你可能在使用libc的任何用户级Linux应用程序中编码时遇到问题(例如因为crt0)。

奇怪的是,今天我甚至不能命名一种不使用C语言的自由软件语言。原则上这是可能的(例如在Linux编译为仅调用系统调用),但我不知道这样的事情。

但是请注意(至少在Linux上)如果您编写一个静态链接的二进制文件,调用任何标准C函数,那么该二进制文件只会占用libc的一小部分(可以访问的那个)来自crt0)。

一些标准的库设施(例如setjmp(3)stdarg(3) ...)通常需要 - 或者至少从某些编译器魔法中获利(甚至mallocprintffree最近GCC)。某些标准库函数无法在便携式C中实现。

如果使用gcc,请勿忘记-ffreestanding gcc选项。请参阅this

注意:你可以认为C99语言有两种方言:托管的C,它包含标准的libc函数,如fprintfmalloc等......并以{开头} {1}} ...和不包含它们的独立C(但包含main等...)并且没有起始约定。