C中的头文件

时间:2013-09-09 16:46:19

标签: c header-files

我已经读了一段时间关于C并决定让我们写一点添加程序,没什么特别的。我对C头的理解是它们是“接口”(比如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都有一个标题,这意味着Sample.h属于Sample.c而没有别的。

有人可以对此有所了解吗?

我可以这样做:

的main.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;
}

sample.h

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

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

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

注意:显然,计算器示例和我的示例将会有所不同,但基本相同 - 对于那些拥有该书的人。我对如何有效地使用头文件感到很遗憾。

2 个答案:

答案 0 :(得分:4)

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

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

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

  • 在某些模块中,可能是foo.c,您将定义完整 功能foo

  • 在任何想要致电foo的模块中,您都会#include "foo.h" (或您使用的任何标题)并调用该函数。

  • 编译/链接代码时,您将确保所有模块, 包括foo.o或其中定义了foo的任何模块 本。

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

答案 1 :(得分:2)

  

我对C头的理解是它们是“接口”(例如   像java和其他语言)但你也可以在其中定义变量   是否有设定值..

这不正确。你不能“定义”变量 - 嗯,你可以,但如果你不止一次包含标题,那么在编译代码时会导致多个定义错误。

  

我可以这样做:

关于您的代码 - 两种变体都是正确的。 C语言使用标头来读取声明,因此标头也是可选的。您可以将代码拆分为as many as you want .h和.c文件。编译器将为每个.c文件创建一个目标文件。包含在c文件中的所有.h文件基本上都嵌入在“编译之前”的C文件中,即在预处理阶段。然后链接器出现在组合对象以生成可执行文件的图片中。

如果我的答案中有些不清楚,请不要犹豫。