在写头文件的时候,经常会看到有如下的格式:
#ifndef MY_H_
#define MY_H_
#endif // !
这个的意思就是如果没有定义这个宏,那就定义这个宏,然后执行中间的声明,他真正的作用是体现在比较大的工程中,下面举个例子说明:
存在这个工程,其中a.h,a.cpp和b.h,b.cpp分别定义了ab两个类,并且b的类还要包括a的头文件。
a.h:
class a{};
b.h:
#include "a.h"
class b{};
c.cpp:
#include "a.h"
#include "b.h"
int main()
{
return 0;
}
此时,编译会报错:
可以看到,是由于a这个类重定义了,原因是在执行c.cpp时,先执行第一行,#include “a.h”,已经把a这个类包含进来了,此时执行第二行#include “b.h”,b.h的第一行又是#include “a.h”,相当于这里对a这个类进行了第二次定义(声明),此时就会报错,如果对a.h进行如下修改:
#ifndef MY_H_
#define MY_H_
class a {};
#endif // !
这时编译运行就会通过,因为再次执行到#include "b.h"里面的#include "a.h"时,第一次已经定义宏了,这次的#ifndef就不会执行,也就不存在重定义的问题了。
总结
#ifndef,#define,#endif以及宏的用法主要是为了防止在较大的工程中,出现重定义的错误。
但vs中添加头文件时,会自动加上
#pragma once
这一句,意思是告诉编译器头文件定义一次就够了,与上述宏的作用是一致的。