将一组函数分成C中的可包含文件?

时间:2010-06-01 13:40:59

标签: c

我知道这在大多数语言中很常见,也可能在C语言中。 C可以处理将几个函数分离到一个单独的文件并将它们包括在内吗?

这些功能也将依赖于其他包含文件。我希望代码保留所有功能,但代码将在几个C脚本中重用,如果我改变它一次,我不希望必须通过每个脚本并在那里更改它。

4 个答案:

答案 0 :(得分:4)

绝对是最好的!您所描述的是头文件。您可以阅读有关此流程的更多信息here,但我将概述以下基础知识。

您将函数分成名为functions.h的头文件,其中包含以下内容:

int return_ten();

然后你可以有一个functions.c文件,其中包含函数的定义:

int return_ten()
{
    return 10;
}

然后在main.c文件中,您可以通过以下方式添加functions.h

#include <stdio.h>
#include "functions.h"

int main(int argc, char *argv[])
{
    printf("The number you're thinking of is %d\n", return_ten());

    return 0;
}

这假设您的functions.h文件与main.c文件位于同一目录中。

最后,当您想将其编译到目标文件中时,您需要将它们链接在一起。假设您使用的是命令行编译器,这只意味着将额外的定义文件添加到最后。要使上述代码生效,您可以在cmd中键入以下内容:gcc main.c functions.c,这将生成一个可以运行的a.out文件。

答案 1 :(得分:1)

在头文件中声明函数,然后在.c文件中实现它们。现在,您可以将#include头文件放入任何使用这些函数的程序中,然后将该程序链接到从.c文件生成的目标文件。

答案 2 :(得分:1)

假设您有一个文件,其中包含您要在其他地方使用的功能:

int func2(int x){
/*do some stuff */
return 0;
}

您要做的是将其拆分为头文件和源文件。在头文件中你只有函数声明,这告诉编译器该函数确实存在,即使它在不同的文件中。标题可能被称为func2.h可能如下所示:

#ifndef HEADER_FUNC2_H
#define HEADER_FUNC2_H
int func2(int x);
#endif /*HEADER_FUNC2_H*/

#ifndef HEADER_FUNC2_H部分是为了确保只使用一次,这样就不会有多个定义。 然后在源func2.c文件中你有自己的实际功能:

int func2(int x){
/*do some stuff */
return 0;
}

现在您使用func2的任何其他文件中都必须包含标题。你用#include“func2.h”做到这一点。因此,例如,如果我们想从randomfile.c调用func2,它将是这样的:

#include "func2.h"
/* rest of randomfile.c */
func2(1);

然后最后一步是在编译时将包含函数的目标文件与编译器链接起来。

答案 3 :(得分:0)

如果要在多个程序中重用函数,则应将它们放在库中,并将其与其余代码链接。

如果您要共享相同的定义(例如宏,类型等),可以将它们放在头文件中,并将其包含在#include中。

请不要直接将“#include”功能代码放入源文件中,这是一种不好的做法,可能导致非常有问题的情况(特别是如果你是初学者,正如你的标签所示)。

通常,当你有一组想要共享和重用的功能时,你需要两者兼顾!您最终会得到一个myfuncs.lib(或libmyfuncs.a)库和一个myfuncs.h标题。

在要重用现有功能的程序中,您将包含库的标题和链接。

一旦掌握了静态库的使用,您还可以了解如何使用动态库。