是否需要在头文件中声明所有C函数

时间:2016-02-12 05:53:47

标签: c function header-files declaration definition

我是否需要在头文件中声明我在.c文件中使用的所有函数,或者我可以直接在.c文件中声明和定义?如果是这样,在这种情况下.c文件中的定义是否也算作声明?

6 个答案:

答案 0 :(得分:3)

对于编译器,如果在.h.c文件中发生声明并不重要,因为编译器会看到预处理的表单。

对于人类开发人员阅读并为您的代码做出贡献,更好(避免复制和粘贴相同的声明两次)以在多个翻译单元中使用任何函数的声明(即.c文件)在一些#include - d标题中。

您可以在使用之前定义一个函数。

顺便说一句,你甚至可以避免声明你正在调用的函数(它默认为遗留目的而返回int),但这是一种糟糕的品味和过时的编码方式(并且大多数编译器都会发出警告)那个案子)。

答案 1 :(得分:2)

  

我是否需要在头文件中声明我在.c文件中使用的所有函数,   或者我可以在.c文件中声明和定义吗?

您使用"使用"在第一个问题和"定义"在下一个问题。有区别。

void foo()
{
    bar(10);
}

此处定义foo并使用bar。您应该声明bar。如果您没有声明bar,编译器会对其返回类型进行假设。

您可以在.c文件中声明bar或在.h文件中添加声明,并在.c文件中添加#include .h文件。无论您使用第一种方法还是第二种方法都取决于您。如果在多个.c文件中使用声明,最好将其放在.h文件中。

您可以在没有声明的情况下定义foo

  

如果是这样,在这种情况下.c文件中的定义是否也算作声明?

每个函数定义也算作声明。

答案 2 :(得分:1)

这两个问题的答案都是肯定的。您可以在头文件和.c文件中声明c函数。与定义相同。但是,如果您在头文件中定义它,则在编译期间可能会出现轻微问题。

答案 3 :(得分:1)

默认情况下,功能具有外部链接。这意味着假设可能会在多个编译单元中使用函数。

然而,有时形成其他函数实现的一些辅助函数并不适用于多个编译单元。使用关键字static声明的此类函数具有内部链接。

通常它们在某个.c模块中声明和定义,在其他编译单元中不可见。

答案 4 :(得分:1)

需要在单独的标头中声明函数的一种情况是,当一个人正在创建一个库供其他开发人员使用时。有些库作为封闭源分发,它们作为库文件(* .dll / * .so ...)和标题提供给您。

头文件将包含所有可公开访问的函数的声明以及所有公开要求的结构,枚举和数据类型等的定义。

如果没有此头文件,第三方库用户将不知道如何与库文件交互,因此无法链接它。

但对于不打算供其他人使用的小型,简单的C程序,不能只将所有内容转储到C文件中并构建它。虽然多年后当你需要维护代码时可能会诅咒自己:)

答案 5 :(得分:0)

不,没有必要。

头文件的原因是将接口与实现分开。标题声明“什么”类(或正在实现的任何内容)将执行,而.c文件定义它将如何执行这些功能。

这减少了依赖关系,因此使用标头的代码不一定需要知道实现的所有细节以及仅为此所需的任何其他类/标头。这将减少编译时间以及实现中的某些内容发生更改时所需的重新编译量。