C语言-#ifndef的作用

转载自:https://www.cnblogs.com/codingmengmeng/p/7221295.html

#ifndef 是"if not defined"的简写,是预处理功能(宏定义、文件包含、条件编译)当中的条件编译,可以根据是否已经定义了一个变量来进行分支选择,其作用是:

1、防止头文件的重复包含和编译;

2、便于程序的调试和移植;

下面分别举例描述。

一、防止头文件的重复包含和编译

错误示范:
headfile_1.h

#include <iostream>
class CTest_1 {
    CTest_1() {
        //do something,eg:init;
    }
    ~CTest_1() {
        //do something ,eg:free;
    }
    void PrintScreen()
    {
        std::cout << "this is Class CTest_1!" << std::endl;
    }
};

headfile_2.h

#include "headfile_1.h"
class CTest_2 {
    CTest_2() {
        //do something,eg:init;
    }
    ~CTest_2() {
        //do something,eg:free;
    }
    void PrintScreen()
    {
        std::cout << "this is Class CTest_2!" << std::endl;
    }
};

sourcefile.cpp

#include <iostream>
#include "headfile_1.h"
#include "headfile_2.h"

int main()
{
    return 0;
}

编译时提示重定义错误:
headfile_1.h中的类CTest_1重定义了。

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

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

#ifndef _HEADFILE_1_H
#define _HEADFILE_1_H
#include <iostream>
class CTest_1 {
    CTest_1() {
        //do something,eg:init;
    }
    ~CTest_1() {
        //do something ,eg:free;
    }
    void PrintScreen()
    {
        std::cout << "this is Class CTest_1!" << std::endl;
    }
};

#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之间的代码也就不会再次被包含,这样就避免了重定义。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值