最次要的作用:
1、避免头文件的反复蕴含和编译;
上面是谬误示范:

headfile_1.h

 1 #include <iostream> 2 class CTest_1 { 3     CTest_1() { 4         //do something,eg:init; 5     } 6     ~CTest_1() { 7         //do something ,eg:free; 8     } 9     void PrintScreen()10     {11         std::cout << "this is Class CTest_1!" << std::endl;12     }13 };

headfile_2.h

 1 #include "headfile_1.h" 2 class CTest_2 { 3     CTest_2() { 4         //do something,eg:init; 5     } 6     ~CTest_2() { 7         //do something,eg:free; 8     } 9     void PrintScreen()10     {11         std::cout << "this is Class CTest_2!" << std::endl;12     }13 };

sourcefile.cpp

1 #include <iostream>2 #include "headfile_1.h"3 #include "headfile_2.h"4 5 int main()6 {7     return 0;8 }

编译时提醒重定义:

  个别地,如果有一个C源文件(如sourcefile.cpp),它蕴含两个头文件(如headfile_1.h和headfile_2.h),而头文件headfile_2.h又蕴含了headfile_1.h,则最终的成果是该源文件蕴含了两次headfile_1.h。如果你在头文件里定义了构造体或者类类型,那么问题来了,编译时将会报反复定义的谬误。

  加上条件编译"ifndef"则问题可解决。在headfile_1.h中加上条件编译,如下:

headfile_1.h

 1 #ifndef _HEADFILE_1_H 2 #define _HEADFILE_1_H 3 #include <iostream> 4 class CTest_1 { 5     CTest_1() { 6         //do something,eg:init; 7     } 8     ~CTest_1() { 9         //do something ,eg:free;10     }11     void PrintScreen()12     {13         std::cout << "this is Class CTest_1!" << std::endl;14     }15 };16 17 #endif    //end of _HEADFILE_1_H

编译通过!

  剖析:当第一次蕴含headfile_1.h时,因为没有定义_HEADFILE_1_H,条件为真,这样就会执行#ifndef _HEADFILE_1_H和#endif之间的代码;当第二次蕴含headfile_1.h时,后面一次曾经定义了_HEADFILE_1_H,条件为假,#ifndef _HEADFILE_1_H和#endif之间的代码也就不会再次被蕴含,这样就防止了重定义。