c - C 中的头文件

标签 c header-files

我已经阅读了一段时间有关 C 的内容,并决定让我们编写一个小的 add 程序,一点也不花哨。我对 C 头文件的理解是它们是“接口(interface)”(例如 java 和其他语言),但您还可以在其中定义具有或不具有设置值的变量。

所以我这样写:

#include <stdio.h>
#include <stdlib.h>
#include "sample.h"

int main(int argc, char** argv) {
    printf("hello World\n");
    add(12, 18);
    return (EXIT_SUCCESS);
}

int add(int a, int b){
    int value = a+b;
    printf("value = %d\n", value);
    return 0;
}

它有一个看起来像这样的头文件:

#ifndef SAMPLE_H_GUARD
#define SAMPLE_H_GUARD
int add(int a, int b);
#endif

我认为头文件,这是我在定义中迷失的地方,假设定义了 add 的使用,所以我所要做的就是调用 add - 根据我的理解,我定义了 add 和然后实现add....的功能

另外,我读过的很多资料都显示一个头文件用于多个 C 文件。现在很多项目每个 c 都有一个 header ,这意味着 Sample.h 属于 Sample.c 而不是别的。

有人可以阐明这一点吗?

我可以这样做吗:

ma​​in.c

#include <stdio.h>
#include <stdlib.h>
#include "sample.h"

int main(int argc, char** argv) {
    printf("hello World\n");
    add(12, 18);
    return (EXIT_SUCCESS);
}

add.c

#include <stdio.h>
#include <stdlib.h>
#include "sample.h"
int add(int a, int b){
    int value = a+b;
    printf("value = %d\n", value);
    return 0;
}

示例.h

#ifndef SAMPLE_H_GUARD
#define SAMPLE_H_GUARD
int add(int a, int b);
#endif

我相信我正在阅读的书:C Programming Language他们有一个像这样拆分的计算器示例,我的问题是 C 如何知道 add 的定义位置?它知道基于头文件的规则,我认为,但不知道实际实现的地方....

有一个例子,他们像这样拆分文件没有像 #include "add.c" 这样的东西,他们所做的只是在实现或使用此功能的文件中包含头文件.

注意:显然,计算器示例和我的示例将有所不同,但基本相同 - 对于那些拥有这本书的人来说。我只是迷失了如何有效且高效地使用头文件。

最佳答案

C 中的头文件将为那些需要它的模块声明函数add,但不会定义 功能。该函数仍将在其自己的模块中定义(例如,在您的情况下,add.c)。

所以一般来说,要使函数 foo 可用于多个模块,您通常会:

  • 选择一个头文件(可能是自己的,如果有其他相关的 定义等)以声明 foo。例如,也许 foo.h 会 有 void foo(...);

  • 在某些模块中,例如 foo.c,您可以定义完整的 函数 foo

  • 在任何想要调用 foo 的模块中,您可以#include "foo.h" (或您使用的任何 header )并调用该函数。

  • 当你编译/链接代码时,你会确保所有模块, 包括 foo.o 或任何在其中定义了 foo 的模块,都是 出席。

头文件中给出的声明提供(当然)函数名称、函数返回类型以及列出所有参数及其类型。这是编译器需要知道的所有信息,以弄清楚如何从调用模块调用函数。在链接时,地址都被解析,这样模块就可以准确地知道函数在其自己的特定模块中的位置。

关于c - C 中的头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18703070/

相关文章:

c++ - 是否有用于打印源文件直接包含的标题的 GCC 选项?

CreateProcess + CREATE_SUSPENDED 标志在 Linux 中是否等效?

c++ - GCC - 包含编译标志的宏

C 打印文本行并更新它们

c - header 相互使用结构和枚举?

c - "small"是c 中的关键字吗?

c++ - 使用c中的remove()函数未删除文件

c++ - 如何测量代码更改的电源效率增加或减少

c++ - 实例化一个类模板并调用它的方法

c++ - 是什么导致 clang 找不到 unordered_map header ?