8

我已经阅读了一段时间的 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 的规则,然后实现添加功能......

此外,我读过的很多资料都显示了多个 C 文件的一个头文件。今天的许多项目每个 c 都有一个标头,这意味着 Sample.h 属于 Sample.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);
}

添加.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"他们所做的那样将头文件包含在实现或使用此功能的文件中。

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

4

2 回答 2

5

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

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

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

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

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

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

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

于 2013-09-09T16:49:08.703 回答
2

我对 C 头文件的理解是它们是“接口”(例如 java 和其他语言),但您也可以在其中定义具有设置值或不设置值的变量。

这是不正确的。您不能“定义”变量 - 可以,但是如果您多次包含标头,则会在编译代码时导致多个定义错误。

我可以这样做吗:

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

如果我的回答中有不清楚的地方,请不要犹豫。

于 2013-09-09T16:54:08.940 回答