编解码器和code.h之间的区别

时间:2013-11-26 08:59:52

标签: c

我正在学习C,我在一些例子中看到代码是用.h保存的,我不确定何时应该将代码保存到.h。结尾.c的文件包含main(),结尾.h的文件可能包含全局变量或函数的声明(但不包含main())?

7 个答案:

答案 0 :(得分:2)

以.h(标题)结尾的文件将通过#include共享。

以.c(实体)结尾的文件用于实现标头和其余代码。

就这么简单:)

答案 1 :(得分:2)

基本上就是这样(非常简化):

在头文件中,您有多个源文件所需的声明,结构和预处理器宏。

在源文件中,您有函数的实际实现,全局变量的定义,以及该源文件专用的声明和预处理器宏。

在C和许多基于C的语言(如C ++)中,编译文件的过程分两步完成:首先运行预处理器,创建一个translation unit,它是所有包含的头文件的组合和源文件,传递给编译器。

答案 2 :(得分:2)

根据您的理解,.h文件包含全局变量或函数的声明。 以下是您需要考虑的案例,

- >由.c文件调用的函数可用作.o文件。在这种情况下.o文件在链接时间与我们的可执行文件链接,编译器不知道任何关于函数的事情。所以我们需要声明那些功能。然后我们制作.h文件,它将函数声明作为一部分。

- >由具有源代码的.c文件调用的函数,在这种情况下,我们通常创建一个包含函数定义的.h文件,并将该文件包含在.c文件中。

答案 3 :(得分:2)

在最简单和最抽象的层面:

.c文件应包含实现您的功能的代码。

.h文件应包含代码的“接口”。

.h文件包含其他代码使用.c文件中的代码所需的所有内容。

例如,如果你有一个将两个整数加在一起的函数,它可能如下所示:

// in the .c file: the actual implementation of the function
int add_two_integers(int a, int b)
{
    return a + b;
}

// in the .h file: just the interface
int add_two_integers(int a, int b);

.h文件包含一些代码为了使用.c文件中的函数需要知道的所有内容。在这种情况下,只有一个函数,.h文件包含其名称和与之关联的所有类型信息。

另一种思考方式:.h文件包含一个“承诺”,即您可以使用一个名为add_two_integers()的函数,它会告诉您如何使用它。 .c文件中的代码可能被编译为库文件,C编译器不会查看库文件并找出其中的内容。您可以使用.h文件告诉C编译器期望的内容。

在某种意义上,.c文件中的内容与.h文件中的内容之间的划分是实现细节。有可能使系统扫描.c文件两次,一次编译一次,一次提取界面信息。但是在C中,将两者分开是你的工作。

可能进入.h文件的其他内容:预定义常量,自定义数据类型,宏和内联函数。宏和内联函数是逻辑代码,因此理想情况下应该在.c文件中,但如上所述,这不是用C实现的方式。编译器需要知道宏和内联函数,所以如果如果您要共享它们,请在.h文件中共享它们。

答案 4 :(得分:1)

.c文件将包含函数定义&全局变量声明。其中.h将包含函数原型和其他依赖库文件。

答案 5 :(得分:1)

声明(原型)进入.h文件。 .h文件是相应.c文件中实现的任何接口。定义在.c文件中。它们实现.h文件中指定的接口。

区别在于.h文件可以(通常会)#included到多个编译单元(.c文件)中。如果在.h文件中定义一个函数,它将以多个.o文件结束,并且链接器将抱怨多重定义的符号。这就是定义不应该放在.h文件中的原因。 (内联函数是例外。)

如果在.c文件中定义了一个函数,并且您想要从其他.c文件中使用它,则需要在每个其他.c文件中提供该函数的声明。这就是为什么你把声明放在.h中,并在每个声明中加入#include。您还可以在每个.c文件中重复声明,但这会导致大量代码重复和无法更替的混乱。

如果在.c文件中定义了一个函数,但您不想在其他.c文件中使用它,则无需在标题中声明它。它本质上是该.c文件的实现细节。在这种情况下,也要将函数设置为静态,因此它不会与其他文件中具有相同名称的函数冲突。

答案 6 :(得分:0)

如果你想在两个文件中使用相同的代码而不是在两个文件中写入该代码。你可以创建可以包含在两个文件中的公共文件。这些公共代码以及常见声明可以放在.h文件中

和.c文件将包含您的uniquie逻辑和主方法

由于