在头文件中包含C文件

时间:2016-02-21 18:51:39

标签: c header-files

在头文件中包含C文件是否正确?一个例子:

myheader.h

#ifndef MYHEADER_H
 #define MYHEADER_H

 #include <stdio.h>

 void foo();

 #include "myfile.c"

#endif // MYHEADER_H

myfile.c文件

#include "myheader.h"

void foo()
{
    puts("I'm foo!!");
}

我可以使用gcc -o main main.c代替gcc -o main main.c myfile.c进行编译,其中主要使用foo()

2 个答案:

答案 0 :(得分:4)

这是合法的,但这并不意味着这是一个很好的做法。

编译通过翻译单元完成,翻译单元从单个源文件独立编译为目标文件。

稍后所有这些翻译单元都链接在一起以生成最终的二进制文件。

现在,这允许您在源文件中隐藏仅应该是该源文件本地的内容(包括本地类型并受到名称冲突保护),这也意味着您将只公开真正意义上的内容。通过头文件公开。

这是一种管理封装和保持代码可维护性的好方法,所以是的,你可以做到,但你不应该这样做。

答案 1 :(得分:0)

这是合法的,但这是非常糟糕的做法。

要做的常见和良好做法是包含扩展名为.h的“头文件”,并在其中只放入“extern”函数声明(以及“丑陋”全局变量声明,如果使用它们)和类型声明。 / p>

在源文件.c中,您将外部函数定义(和外部变量初始化)与静态函数一起放入。使用约定为每个源文件生成一个目标文件(.o或.obj)是有道理的。

如果将一个extern函数定义放在标题中并将其包含在两个不同的源文件中,则链接时会出错(生成可执行文件的最后一步)。如果对静态函数执行相同的操作,该函数将在每个目标文件中有效地定义一次,它将起作用,但根本不会进行优化。

按照惯例,我们只在extern函数声明的头文件中使用“extern”说明符,并且我们在源文件中没有设置说明符(extern是默认值,如果你没有指定“static”,那么function是extern)。 / p>