说明:
当一个源文件(a.cpp)要调用另一个源文件(b.cpp)定义的方法时,需要在a.cpp中写上这个方法的声明(只需要该方法的名称、返回值和参数,类似Java的接口);
如果每次调用其他文件的方法时都写上相同的声明就会很麻烦,而且当b.cpp的定义修改时所有调用到该文件的声明都要修改,这样工作量太大且容易出错,所以出现了头文件,我们把所有的声明都存放到头文件中,需要使用到的时候使用宏命令“#include”包含进这个.cpp文件中即可;
#include:只有一个功能:把它后面所写的那个文件的内容,完完整整地、一字不改地拷贝到当前的文件中来;
而C++规定,定义只有一次,声明可以多次,导致头文件只能写声明,不能进行定义,如果头文件进行定义,被多个文件#include后,就会出现多个定义导致编译失败;
头文件不会进行编译,只会通过#include被其他多个源文件包含,然后头文件中的内容作为源文件的一部分进行编译;
需要注意的是,.h头文件不用写在编译器的命令之后,但它必须要在编译器找得到的地方、通常是和源文件位于同一个目录下;
头文件的后缀名可用任意名称;
预处理程序:
预处理程序包含3种,分别是:宏定义、文件包含和条件编译。
宏定义:
宏定义使用“#define”后跟定义的字符串,宏定义的字符串会在编译时直接进行文本替换。
1 #define PI 3.14159
在程序中遇到的所有PI字符串都会被替换为3.14159。
文件包含:
文件包含有两种形式,其含义是讲制定的文件的内容拷贝到当前文件中。
1 #include "filename" 2 #include <filename>
使用尖括号表示使用系统的文件,使用双引号表示在当前目录下进行查找(包含子目录),当然除了填写相对路径外还可以填写绝对路径。
条件编译:
1 #ifndef COMDEF_H 2 #define COMDEF_H 3 4 //头文件内容 5 6 #endif
使用上述宏命令可以使头文件的内容只被执行一次;
要达到上面的目的还可以使用另一种方法:
1 #pragma once
注意:#ifndef需要避免同名的问题,但是该方法所有编译器都支持,而#pragma once可以避免命名的问题但是只有较新的编译器支持。
extern:
extern关键字指定当前的内容为声明;
1 double up;//定义了up变量,并且赋值为0 2 extern double up;//声明了外部的变量up,不会分配内存
函数的声明extern关键词是可有可无的,因为函数本身不加修饰的话就是extern的;
例外:
const对象可以直接定义在头文件中;
内联函数也可以直接定义在头文件中;
类的定义放在头文件中,而类的函数成员的实现代码放在一个.cpp文件中;
最新评论