我用Java作为编程语言有相当多的练习,但我对C完全是新手.我理解头文件包含方法和变量的前向声明.这与Java中的抽象类有什么不同?
简短的回答:
抽象类是面向对象编程的概念.由于构造C语言的方式,头文件是必需的.它无法以任何方式进行比较
答案很长
要理解头文件以及头文件的需要,您必须理解"声明"和"定义"的概念.在C和C++中,声明意味着您声明某些东西存在于某处,例如函数.
void Test(int i);
我们现在声明,在程序的某个地方,存在一个函数Test,它接受一个int参数.当您有定义时,您可以定义它是什么:
void Test(int i) { ... }
这里我们定义了函数void Test(int)实际上是什么.
使用extern关键字声明全局变量
extern int i;
它们的定义没有extern关键字
int i;
编译C程序时,将每个源文件(.c文件)编译为.obj文件.定义将作为实际代码编译到.obj文件中.编译完所有这些后,它们将链接到最终的可执行文件.因此,只应在一个.c文件中定义一个函数,否则,相同的函数将在可执行文件中多次结束.如果函数定义相同,这并不重要.如果将全局变量链接到同一可执行文件两次,则会出现问题.这将使一半代码使用一个实例,另一半代码使用另一个实例.
但是在一个.c文件中定义的函数无法查看在另一个.c文件中定义的函数.因此,如果从file1.c文件中需要访问file2.c中定义的函数Test(int),则在编译file1.c时需要有一个Test(int)声明.当file1.c被编译成file1.obj时,生成的.obj文件将包含需要在某处定义Test(int)的信息.链接程序时,链接器将识别file2.obj包含file1.obj所依赖的函数.如果没有包含此函数定义的.obj文件,您将收到链接器错误,而不是编译器错误(链接器错误更难以找到并纠正编译器错误,因为您没有获得结果的文件名和行号文件)
因此,您使用头文件存储相应源文件中存储的定义的声明.