头文件中的方法

时间:2010-09-16 10:16:29

标签: c

为什么有些人在头文件中编写方法?

在过程文件和头文件中编写方法有什么区别?

以下是代码:

Work.h

#include <time.h>

void DoWork(int n)
{
    clock_t t = clock() + n * CLOCKS_PER_SEC / 1000;
    while(clock() < t);
}

Program.c

#include <stdio.h>
#include "work.h"
int main(void)
{
     printf("Starting work\n");
     DoWork(100);
     printf("Work has finished\n");
}

在过程文件和头文件中编写方法或它们是否相同?

编辑1:我知道的唯一区别是,如果我在过程文件中编写DoWork(),那么我必须编译过程文件,然后在编译主程序时传递目标代码。

感谢。

2 个答案:

答案 0 :(得分:3)

预处理器将 - 除其他外 - 通过包含的这些头的代码递归替换所有#include指令。 (基本上,它是一个愚蠢的文本替换机器。)结果是一个源文件,其中所有包含的标头以递归方式复制到其中,称为翻译单元。实际上,这是您的编译器所看到的(尽管现代编译器经常将翻译过程的不同阶段联系在一起以便更快)。
您可以将多个翻译单元贡献给单个结果程序。 (事实上​​,对于任何超过50行代码的东西,这几乎都是标准。)

当您在标头中定义函数时(而不是仅仅声明它们),并且具有这些定义的标题随后会包含在多个源文件中链接到某些可执行文件,然后链接器将找到相同函数的多个定义,并放弃发出令人讨厌的错误消息。

答案 1 :(得分:1)

这一切都归结为“项目管理”。

在每个项目中,所有函数必须唯一地命名为(尽管例外),以便链接器可以通过生成对正确函数的调用来完成程序。

在一个小项目中(比如上面的“工作”项目),很容易看出代码没有重复,但随着时间的推移,你的项目越来越难以管理。如果您的几个“.c”文件#include "work.h",则每个文件都会获得函数定义DoWork的副本。如果你将函数定义放在'.c'文件中,或者在'.h'文件中放置一个声明,就不会有任何错误。

函数声明:告诉编译器如何使用函数
功能定义:告诉编译器函数的功能