【问题标题】:Where are declaration and definition stored?声明和定义存储在哪里?
【发布时间】:2019-08-25 12:12:31
【问题描述】:

对于预定义函数,声明和定义存储在哪里? 声明是否存储在库中?如果是,那为什么叫库函数呢?

【问题讨论】:

  • “预定义”是指 C 标准 API 之一吗?还是你写的? (答案大致相同,但你需要在这里澄清你的困惑点)
  • 样板文件是在 .h 文件中声明,在存储在库程序员机器上的源文件中定义,并在您链接的库中实现。
  • @ShadowRanger 我的意思是像 printf() 这样的 c 标准函数

标签: c function declaration


【解决方案1】:

这是一个不精确的问题。我们能给出的最佳答案是:

  1. 标准库函数的声明最好被认为是存储在它们的头文件中。

  2. 根据您的想法,标准库文件的定义要么在这些库的源文件中(您可能不可见,这是您的编译器供应商的商业机密),要么在库文件本身(.a.so.lib.dll)。

  3. 如今,标准库函数的知识通常也内置于编译器中。例如,如果我编写了旧的经典 int main() { printf("Hello, world!\n"); },但没有任何 #include 指令,我的编译器会说,“警告:隐式声明库函数 'printf'”和“包含头文件 ”。

【讨论】:

  • 这些天,gcc 对printf() 非常了解,因此它会在可能的情况下将其替换为puts()(如您的示例中:callq 400420 <puts@plt>)。
【解决方案2】:

这个故事有两个方面:

  • 调用库/外部函数的代码:编译器在您编译的模块中生成一个引用,该引用对您希望在其他地方存在的函数原型进行编码。
  • 您的代码必须链接到的预编译库文件:库文件包含其函数的编码原型以及这些函数的实际编译二进制文件(即定义/实现)。

当您的代码使用外部函数时,编译器会生成对该函数的引用,并假定稍后将在链接阶段解析该函数​​。

在链接过程中,会建立函数引用列表。链接器希望找到每个使用的引用的“定义”/实现。

【讨论】:

    【解决方案3】:

    头文件包含内置函数的声明,库包含函数的定义。

    之所以命名库,是因为在我看来,作为包含书籍的实际库,这些库包含类、函数、变量等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      相关资源
      最近更新 更多