c++中 头文件 .h 和 源文件 .cpp
1, 二者是什么
头文件 .h 里边写类的声明,包括类里面成员和方法的声明, 函数原型, 全局变量的定义,# define 常数等等,但是一般不会写出具体的实现。
定义头文件时候要在开头和结尾写上预编译语句:
#ifndef CIRLE_H
#define CIRLE_H
// 你的代码内容
#endif
这样的目的是防止重复编译,不然容易出错
源文件 .cpp , 开头要include 头文件,然后在源文件中对 头文件中的成员函数,进行具体实现。
2, 二者的区别和联系
.h 文件叫头文件,它是不能被编译的, #include 叫做预编译指令,相当于将.h文件中的内容添加到了.cpp的头部。
每个.cpp文件会被编译成一个.obj文件,然后将所有的obj文件链接起来形成可指向文件。 .h文件的名称和.cpp文件的名称也没有必要相同,编译器只认 #include语句。
3, 注意事项
同一个项目中c++ 和c对应的头文件要注意区别
虽然预编译指令对 头文件的文件名没有特殊要求,只是将头文件的内容复制到 源文件中,就算是 .txt文件也能够正常使用。所以在只有一种语言的代码中,使用.h文件都一样, 在两种语言都存在的项目中 但是约定 .h文件对应 .c程序, .hpp文件对应.cpp程序,使用两种文件名进行区别。避免两种语言混淆导致报错。
4 项目中定义全局函数、全局变量
c++中,一个函数或者变量 可以在多个位置被声明,但是只能被定义在一处;
如果在.h文件中执行 int A; 这是定义语句,如果其它多个.cpp文件include了这个文件,那么int A被多次定义,就会报错。
要解决这个问题,就要使用extern 关键字来修饰 变量: extern int a;
extern的意义在于说明,这是一个声明,而不是一个定义;
声明,和定义的区别就在于是否为变量开辟内存空间。
extern 是可以省略的,对于函数,需要给出方法的实现,如果不给实现,就只能属于声明,二者可以很好区分,所以可以省略;而对于变量就必须加上,如果不加上,就会认为是定义,而不是声明。
正确操作:
在 test1.hpp 中声明 extern int a;
在 test1.cpp 中定义 int a = 10; (或者使用 int a; 定义, 这样的话值是默认值 0)
在 test2.cpp 中 #include “test1.hpp”, 这样便可以在 test2.cpp 中直接使用 a 变量了.