C++的#ifndef/#define/#endif的含义
.h文件作用:
写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。
.cpp文件作用:
源文件主要写实现头文件中已经声明的那些函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件。那么当你需要用到自己写的头文件中的类时,只需要#include进来就行了。
示例:
Circle.h
#ifndef CIRCLE_H #define CIRCLE_H class Circle { private: double r;//半径 public: Circle();//构造函数 Circle(double R);//构造函数 double Area();//求面积函数 }; #endif
Circle.cpp
#include "Circle.h" Circle::Circle() { this->r=5.0; } Circle::Circle(double R) { this->r=R; } double Circle:: Area() { return 3.14*r*r; }
main.cpp
#include <iostream> #include "Circle.h" using namespace std; int main() { Circle c(3); cout<<"Area="<<c.Area()<<endl; return 1; }
#ifndef/#define/#endif 防止该头文件被重复引用
“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。比如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include "a.h" 和#include "c.h"此时就会造成c.h重复引用。
被重复引用的后果:
有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。
有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。
条件编译 命令 最常见的形式为:
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。
其中#else部分也可以没有,即:
#ifdef
程序段1
#endif
例如:
//如你在头文件aaa.h中定义了一个类aaa如下:
class aaa
{
};
/*如果两次#include "aaa.h"(不见得是直接,也有可能两个不同的头文件中都包含了这个头文件)就会出错,因为相同的类不能定义两次。把aaa.h稍做修改: */
#ifndef _aaa_
#define _aaa_
class aaa
{
};
#endif
/*就可以避免这样的问题。因为当你已经包含过这个文件,_aaa_就会有了定义,那么#ifndef的条件为假,就不会再执行后面的类定义了。 */
参考链接:https://blog.csdn.net/fly_yr/article/details/39964035
参考链接:https://www.cnblogs.com/fenghuan/p/4794514.html