• 关于#ifndef,#define,#end的说明


    #ifndef,#define,#end 是宏定义的一种---条件编译

    这样我直接举个例子好了:我定义两个相同的类A分别在single.h和singlenew.h 

    single.h:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class A
     5 {
     6 public:
     7     A()
     8     {
     9         cout<<"Single header Define"<<endl;
    10     }
    11 };

    singlenew.h

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class A
     5 {
     6 public:
     7     A()
     8     {
     9         cout<<"SingleNew_h header Define"<<endl;
    10     }
    11 };

    现在我们写个测试函数定义一个类A的实例,看它究竟会调用哪个:

    main.cpp:

     1 #include "single.h"
     2 #include "singlenew.h"
     3 #include <iostream>
     4 using namespace std;
     5 
     6 
     7 int main()
     8 {
     9     A a;
    10     return 0;
    11 }

    我们编译一下,咦,出错了:

    意思是类A重定义了。

    为什么呢:因为我们头文件中包含了single.h和singlenew.h 在这两个头文件中都定义了类A,那么久出现这个错误

     

    现在我们重新给两个头文件加上条件编译:

    single.h

     1 #ifndef _CLASS_A
     2 #define _CLASS_A
     3 #include <iostream>
     4 using namespace std;
     5 
     6 class A
     7 {
     8 public:
     9     A()
    10     {
    11         cout<<"Single header Define"<<endl;
    12     }
    13 };
    14 #endif

    singlenew.h

     1 #ifndef _CLASS_A
     2 #define _CLASS_A
     3 #include <iostream>
     4 using namespace std;
     5 
     6 class A
     7 {
     8 public:
     9     A()
    10     {
    11         cout<<"SingleNew_h header Define"<<endl;
    12     }
    13 };
    14 #endif

    main.c文件不变,现在我们重新编译运行。

    这下正确了吧,当然我们还有个疑问,为什么执行了single.h中定义的类的构造函数。这是因为在主函数中我们

    包含"single.h"再包含"singlenew.h"的原因当在single.h中找到了class A的定义,那么已经有了_CLASS_A这个

    宏定义了,再进入"singlenew.h"文件中发现已经有了宏_CLASS_A的定义,于是直接略过该文件中的类A的定义.

    不信我们交换single.h和singlenew.h在主函数的位置:就有如下结果了。

    这下对了吧。

    当然也许你有疑问说不会有人傻到定义两个相同的类。其实条件编译宏定义多数函数用在解决文件重复包含的情

    况下。比如类A定义在A.h中 我们在文件B中使用了类A,那么文件B必然要包含A.h 这时如果有个C文件同时用到了

    类A和类B是不是要同时包含文件A和文件B呢,然而文件B中已经包含了文件A,此时是不是文件C将包含文件A两

    次呢,所以条件编译大多数用在这种情况,当我们的工程很庞大的时候,你会发现会经常出现重复包含相同文件的

    问题,所以条件编译在大工程中被广泛应用。

  • 相关阅读:
    docker 报错 Error response from daemon: error while validating Root CA Certificate: x509: certificate has expired or is not yet valid
    Python list 与 str 互转
    小程序 url传参 参数值过长 接收时候 内容不全的问题
    es6新增对象字面量语法
    Squid Proxy
    常见开发工具安装方法
    批判世界之前先清理你的房间
    windows的双网卡问题
    SSH
    【逆向】Yara规则编写安装与使用教程
  • 原文地址:https://www.cnblogs.com/vpoet/p/4662804.html
Copyright © 2020-2023  润新知