gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:26:09 25 4
gpt4 key购买 nike

到目前为止我见过的所有 C 语言软件都广泛使用了所谓的“C 标准库”,这是一个软件的一部分(或者实际上) C 标准本身。所以,无论版主怎么想,这都不是一本书,也不是一个商业软件。相反,它是包含类似 malloc() 之类的实现的基本软件库。 , printf()strcpy()通常与所有系统捆绑在一起。

现在,我需要用 C 语言编写一些软件而不使用该库,因为它在该环境中既不可用也不可行。但我仍然需要读写文件和套接字。

对类似问题或环境有任何想法或指示吗?

最佳答案

Stricto sensu,一个不使用标准库的可移植(托管)C99 程序甚至无法进行任何输入/输出,或者可能产生任何可观察到的副作用。您甚至无法在堆中分配任何数据(就像malloc 那样)。顺便说一句,任何 C99 托管实现都需要 libc;您想要一个独立的 C 库(根据定义,它是“特定于实现的”;实际上,它可以以特定于实现的方式使用特定于操作系统的服务。另请参阅 this)。

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

一些库(例如 GTK 的 Glib,...)提供了大多数标准 C 库函数的等效功能(但它们需要一些 libc,即托管 POSIX 系统)。

请注意,您可能会考虑使用 musl-libc也许可以从中删除您不需要的功能。您还可以考虑使用一些提供标准子集的 libc,例如dietlibc 。另请参阅维基页面 C standard library .

顺便说一句,您在使用 C 语言编写任何不使用 libc 的用户态 Linux 应用程序时可能会遇到问题(例如,因为 crt0 )。

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

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

一些标准库设施(如 setjmp(3)stdarg(3) ...)通常需要 - 或者至少受益于 - 一些编译器魔法(甚至 mallocprintf免费使用最近的 GCC )。一些标准库函数无法在可移植 C 中实现。

如果使用 gcc,请不要忘记在这种情况下 gcc-ffreestand 选项。请参阅this .

引用n1570 ,一项(草案)C11 标准,几乎与 ISO 标准类似,或与 n2573 类似。 ,接近C20标准。另请参阅Modern C还有这个C reference website 。独立开源应用程序的示例包括 Linux kernel ,但是github上还有很多其他的或gitlab并在 OSDEV 上提到,也适用于 ArduinoRaspberryPi 。我建议下载他们的源代码并研究它以获取灵感。

注意:您可以认为 C99 语言有两种方言:托管 C,其中包含标准 libc 函数,例如 fprintfmalloc 等。 .. 并以 main 开头...以及不包含它们的独立 C(但包含 setjmp 等...)并且没有启动约定。

关于没有 C 标准库的 C 程序。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26591647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com