【问题标题】:Does compiler provide these functions: printf, scanf?编译器是否提供这些函数:printf、scanf?
【发布时间】:2015-08-14 08:59:12
【问题描述】:

我现在正在学习 C 语言。在这本书中,据说“编译器提供了这些库函数:'printf','scanf'……”。

我不明白。这些函数是在头文件<stdio.h> 中定义的不是吗?

为什么这本书会解释那些由编译器提供的功能?

【问题讨论】:

  • 那是哪本书?顺便说一句,好问题。
  • @cacho 是韩国作者写的编程书。 C 表达。

标签: c


【解决方案1】:

printfscanf 和其他标准库函数作为实现的一部分提供。

C 实现由几个组件组成。编译器只是其中之一。图书馆是另一个;它由 headers(通常作为源文件提供,如 stdio.h)和某种形式的 object code 文件组成,其中包含实际实现库函数的代码。

标头stdio.h声明这些功能;它没有定义它们。 printf 的声明类似于:

int printf(const char *format, ...);

printf定义 是实际执行解析格式字符串、访问参数并将格式化输出发送到stdout 的工作的代码。这通常(但不一定)用 C 语言编写,并作为某种可链接的目标代码提供。

对于某些 C 实现,编译器和库由同一组织提供。对于其他人,它们可能会单独提供(例如 MinGW 将 gcc 编译器与 Microsoft 的库相结合)。

【讨论】:

  • 那么,“编译器提供库函数”是错误的说法吗?
  • 他们是分开的东西,对吧?我的意思是,“C 库函数”、“编译器”。
  • C 的完整实现提供了编译器和所需的运行时支持。在许多 Unix 系统上,C 运行时库与编译器有些分离,但编译器必须知道如何创建程序(否则它没有多大用处)并且必须知道它将使用哪个库。但是编译器绝对是一个完全独立的程序,与您使用它创建的程序或“默认 C 库”(甚至不是程序——它只是一个库)不同。
  • @JonathanLeffler:编译器不一定要知道程序将使用哪个库;这取决于链接器。
  • 然后你会遇到“什么是编译器”的问题——是的,你是对的,是的(当然,IMO)我也是对的,但我们使用不同的定义术语“编译器”,这就是为什么我们都适合我们不同的定义。
【解决方案2】:

函数由标准库提供,标准库是通常由编译器作者编写的预编译代码的集合(但它确实不是编译器本身的一部分)。 p>

但请注意,函数仅在头文件中声明定义驻留在已编译的源文件中。

【讨论】:

  • 嗯...对不起,我不明白。如果函数是在头文件中声明的,为什么还要从标准库中重新提供这些函数?
  • @nujabes:头文件只包含prototypes,这就是编译文件所需的全部内容;实际的实现通常是在一些静态或动态库中已经编译好的。这避免了每次构建程序时都需要重新编译整个标准库。
  • @nujabes:因为头文件不包含实现功能的代码。实现目标文件在标准库中;标头只是声明了定义供您使用的函数。
  • @JonathanLeffler 哦,谢谢,有道理!
  • @MatteoItalia 谢谢!那么“编译器提供库函数”的说法是错误的,对吧?摘要:库函数就是库函数。编译器只是翻译这些函数。是真的吗?
【解决方案3】:

通过说“编译器提供这些库函数,'printf','scanf'..”,这本书的作者是马虎的。

符合标准的 C 实现在头文件中提供了这些函数的声明,并在一些缺少的库中提供了这些函数的实现。编译器只是 C 编程环境的一个方面。

【讨论】:

  • 谢谢!你说“有些库不足”,是标准库吗?
  • @nujabes,不同的编程环境提供了不同的方式来支持标准库。我不想太具体。
【解决方案4】:

编译器不提供这些功能。编译器的目标是将您的高级语言代码翻译成另一种形式,尤其是可执行二进制文件。

标准 C 库包含 stdio.h 和 stdlib.h 中的函数。

编译器links带有您的代码的标准库,以便您的代码可以调用这些函数。

对于几乎所有的库,您必须告诉编译器您要链接哪些库。碰巧对于某些编译器,stdio.h 和 stlib.h 的库 (libc) 是 automatically linked,而您无需指定它们。

【讨论】:

  • 默认 C 库通常提供标准 C 库中的所有 C 函数,除了(可能 — 它取决于平台)来自 <math.h> 的数学函数。 (我从来不需要使用<tgmath.h>;我不确定它们是使用数学函数还是使用其他函数。)当数学库是独立的时,它通常加载-lm,并且名称是 libm.a 或类似名称 - 但库名称和扩展名因平台而异。 Mac OS X 在主库中有数学函数。 [...继续...]
  • […continuation…] 我不太喜欢谈论“stdio 和 stdlib 库”的术语。有标题<stdio.h><stdlib.h>,但只有一个库(或两个库)——C 库(也许还有数学库)。
  • @JonathanLeffler:谢谢。我将“stdio 和 stdlib 库”的措辞更改为“stdio.h 和 stlib.h 的库 (libc)”。
【解决方案5】:

标准库和 GCC 提供的那些函数包括标准 C 库中许多函数的内置版本。 https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多