在头文件中包含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()
。
答案 0 :(得分:4)
这是合法的,但这并不意味着这是一个很好的做法。
编译通过翻译单元完成,翻译单元从单个源文件独立编译为目标文件。
稍后所有这些翻译单元都链接在一起以生成最终的二进制文件。
现在,这允许您在源文件中隐藏仅应该是该源文件本地的内容(包括本地类型并受到名称冲突保护),这也意味着您将只公开真正意义上的内容。通过头文件公开。
这是一种管理封装和保持代码可维护性的好方法,所以是的,你可以做到,但你不应该这样做。
答案 1 :(得分:0)
这是合法的,但这是非常糟糕的做法。
要做的常见和良好做法是包含扩展名为.h的“头文件”,并在其中只放入“extern”函数声明(以及“丑陋”全局变量声明,如果使用它们)和类型声明。 / p>
在源文件.c中,您将外部函数定义(和外部变量初始化)与静态函数一起放入。使用约定为每个源文件生成一个目标文件(.o或.obj)是有道理的。
如果将一个extern函数定义放在标题中并将其包含在两个不同的源文件中,则链接时会出错(生成可执行文件的最后一步)。如果对静态函数执行相同的操作,该函数将在每个目标文件中有效地定义一次,它将起作用,但根本不会进行优化。
按照惯例,我们只在extern函数声明的头文件中使用“extern”说明符,并且我们在源文件中没有设置说明符(extern是默认值,如果你没有指定“static”,那么function是extern)。 / p>