之前写过一篇关于多文件的博客,里面说的一些东西是比较宽泛的,不太具体,而且也没有涉及到多文件的一些本质性的东西。这篇博客再来谈谈多文件的一些东西。
在说多文件之前,先说一说工程吧,工程的建立是为了处理稍微复杂一点的问题。通常情况下,一个工程包含多个文件,其中有头文件(.h)和源文件(.c/.cpp)。在头文件中的一些声明个格式:变量:extern int a; 函数: int func(); 类: class A{int a; int fun();};在源文件中的一些定义的格式:变量:int a = 0;(建议初始化,涉及到一个强符号,弱符号的问题) ; 函数: int func() {}; 类: int A::fun() {}
一、多文件的作用与使用
我们可以把多文件与函数类比一下,函数抽象出了一些功能的共性,供其他地方调用。在工程中,多文件也是如此,抽象出了一些其他文件所需使用的共同的功能,为其他文件使用这些功能提供一个接口,提高了代码的重用性,是工程的层次更加清晰,有利于工程的维护。举个例子:我们可以建立头文件h1,h2,h3,h4,源文件c1,c2,c3,c4,其中h1中声明一些抽象出来的函数,在c1中定义这些函数,在其他文件中,需要时可以#include“h1”文件。
二、使用多文件是常见的一些问题
我们刚接触多文件时,可能会碰到这样一些问题,编译时报错,链接时出现问题,这些错误很多情况下是由于重定义产生的(多次声明不会产生问题,多次定义会产生问题)。在头文件里面,我们正常只会放一些函数和变量的声明,至于一些文件(<stdio.h>之类)则放在对应的源文件中来包括。要注意一点:不要把函数和变量的定义放到头文件中,否则在其他文件调用头文件时,会出现头文件多次被包括,其中的函数和变量会出现重定义的现象,从而会出现一些比较奇怪的问题。
三、一些小技巧,宏定义的使用
当工程很大时,头文件可能会被包含很多次,每次包含都会编译头文件,这显然是浪费了时间和资源,相同的头文件只需要被编译一次就可以了。这里的话,我们就要用到宏定义了,在头文件的开头加上这样的语句:
#ifndef PROJECT_HEADERA_H
#define PROJECT_HEADERA_H
在头文件的最后加上这样的语句:
#endif
这就可以确保这个头文件只被编译一次。这里要注意一点,每个头文件里所用的宏名必须是独一无二的,不能雷同,可以使用工程名+头文件名的命名方法。
这边有个我用多文件写的排序工程的实例,有兴趣的可以看一下:
http://download.youkuaiyun.com/detail/u010084308/6809151