#ifndef作用

最主要的作用:
1、防止头文件的重复包含和编译;
下面是错误示范:
headfile_1.h

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

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

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

编译时提示重定义:
一般地,假如有一个C源文件(如sourcefile.cpp),它包含两个头文件(如headfile_1.h和headfile_2.h),而头文件headfile_2.h又包含了headfile_1.h,则最终的效果是该源文件包含了两次headfile_1.h。如果你在头文件里定义了结构体或者类类型,那么问题来了,编译时将会报重复定义的错误。
【#ifndef作用】加上条件编译"ifndef"则问题可解决。在headfile_1.h中加上条件编译,如下:
headfile_1.h
1 #ifndef _HEADFILE_1_H 2 #define _HEADFILE_1_H 3 #include 4 class CTest_1 { 5CTest_1() { 6//do something,eg:init; 7} 8~CTest_1() { 9//do something ,eg:free; 10} 11void PrintScreen() 12{ 13std::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之间的代码也就不会再次被包含,这样就避免了重定义。

    推荐阅读