美文网首页
浅谈#ifndef~#define~#endif~的作用

浅谈#ifndef~#define~#endif~的作用

作者: spaceX | 来源:发表于2017-11-06 15:33 被阅读0次

    /*

    #ifndef _STDAFX_H

    #define _STDAFX_H

    #include         //cin  cout

    #include           //malloc  free

    #include           //strcpy

    #include           //exit()

    #endif

    */

    (1)内容:在头文件(StdAfx.h)开头写上两行:

    #ifndef _STDAFX_H

    #define _STDAFX_H//一般是文件名的大写

    ············

    ············

    头文件结尾写上一行:

    #endif

    (2)作用:主要目的是防止头文件的重复包含和编译

    例如:

    假设你的工程里面有4个文件,分别是 a.cpp , b.h,  c.h,   d.h。

    a.cpp的头部是:

    #include   "b.h "

    #include   "c.h "

    b.h和c.h的头部都是:

    #include   "d.h "而d.h里面有int a,即a的定义。这样一来,编译器编译a.cpp的时候,先根据#include   "b.h "去编译b.h这个文件,再根据b.h里面的#include   "d.h ",去编译d.h的这个文件,这样就把d.h里面的int a编译了;然后再根据a.cpp的第二句#include   "c.h ",去编译c.h,最终还是会找到的d.h里面的int a,但是int a之前已经编译过了,所以就会报重定义错误。

    加上ifndef/define/endif,就可以防止这种重定义错误。

    (3)另外还有一点需要注意:

    在其他文件如main.cpp在使用StdAfx.h的同时又用到其他函数库时,要注意函数库放的位置

    如:

    main.cpp:

    #include

    #include"StdAfx.h"

    .........

    运行时会出现错误!!!!原因:

    编译器通过一个头文件stdafx.h来使用预编译头文件。编译器认为,所有在指令#include"stdafx.h"前的代码都是预编译的,它跳过#include"stdafx.h"指令,使用projectname.pch编译这条指令之后的所有代码。

    因此,所有的MFC实现文件第一条语句都是:#include"stdafx.h"。在它前面的所有代码将被忽略,所以其他的头文件应该在这一行后面被包含。否则,你将会得到“Nosuchfileordirectory”这样让你百思不得其解的错误提示。

    所以要把#include"StdAfx.h"放在最前面(下面是正确的形式)

    main.cpp:

    #include"StdAfx.h"

    #include

    .........

    相关文章

      网友评论

          本文标题:浅谈#ifndef~#define~#endif~的作用

          本文链接:https://www.haomeiwen.com/subject/akulmxtx.html