zoukankan      html  css  js  c++  java
  • 浅谈#ifndef

    在学习C++的过程中,我们经常发现在头文件前部有一些标识符定义,比如:

    //示例1:

    #ifdef CREATEDELL_API_DU
    #else
    #define CREATEDELL_API_DU _declspec(dllimport)


    //示例2:

    #ifndef DLL_API
    #define DLL_API __declspec(dllexport)
    #endif
    #else
    #define DLL_API __declspec(dllimport)
    #endif // !DLL_API

    //导出函数,若要导出函数,必须出现在调用约定关键字的左边(最左边)
    DLL_API int add(int a,int b);

    //导出类,要导出类中的所有公共数据成员和成员函数,必须出现在类名的左边(挨着)
    class DLL_API cls
    {
    public:
    int add(int a,int b);
    }


    //示例3:

    #ifndef _MAIN_H_
    #define _MAIN_H_

    //示例4:

    #ifndef LX_DLL_CLASS_EXPORTS
    #define LX_DLL_CLASS __declspec(dllexport)
    #else
    #define LX_DLL_CLASS __declspec(dllimport)
    #endif
    这样几段代码的意思是 如果没有定义函数CREATEDELL_API_DU、DLL_API、头文件main.h、LX_DLL_CLASS 的别名,就定义它,作用是如果有其他文件多次调用这个头文件,那么为了防止重复定义,加入判断语句,只有第一次会进行定义,当第一个定义后,其他的调用定义会忽略。

    在大型文件系统中,可能有多个cpp包含一个头文件,添上这一句后就可以防止头文件被多次编译。

    #ifndef xxx

    #define xxx

    //头文件正文

    #endif
    头文件中这一段是一段完整的内容,无论改文件被包含多少次,只有xxx在第一次定义时,头文件正文才会编译,其他时候不会。头文件可以使用多段这样的内容,各有各的标识符,在程序中可以提前定义标识符,从而指定某些段头文件不编译。

    给你举个例子,再顺便分析一下:
    假设你的工程里面有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里面有class D的定义。

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

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

  • 相关阅读:
    Android中onBackPressed()的使用
    Python初次学习
    svn Mac下面无法更新png
    UIView的layoutSubviews和drawRect
    "_deflate", referenced from: -[NSData(NSDataAdditions) gzipDeflate] in NSDataAdditions.o
    Error12
    pods安装
    xib为view添加边框
    这些机型将被淘汰
    Development cannot be enabled while your device is locked.
  • 原文地址:https://www.cnblogs.com/WAsbry/p/13026979.html
Copyright © 2011-2022 走看看