#ifdef、#ifndef、#endif功能及其应用

1、功能

首先要知道#ifdef的功能,ifdef一看就是if define的缩写,其实就是一个条件判断语句,这个语句必须和#endif组合使用。看以下例句:

#include <iostream>
using namespace std;

#define num 123

int main() {
#ifdef num //如果宏定义了num,则执行#ifdef和#endif之间的语句
    cout<<"num = "<< num << endl;
#endif

#ifndef num//如果没有宏定义num,则执行#ifdef和#endif之间的语句
    cout<<"Error! you have not defined num" <<endl;
#endif
    return 0;
}

自己运行试试这个例子很容易知道这个两个语句的功能。其实就是一个条件检测语句,检测你是否定义了某个名为XXX的宏,如果定义了执行到endif之前的下列语句。endif就相当于一个括号,把需要执行的语句括起来。(ifndef就是if not def的缩写)

2、应用

肯定很多人就要想了,这个检测宏的语句拿来干啥,在一个代码块中我自己用眼睛看不香吗?问题就在这里,万一宏不在一个代码块中就有用了。假设有三个c++的.h类型的文件分别起名为A.h、B.h、C.h,这个时候B.h include了C.h,A.h include了B.h,A.h include了C.h。具体关系如下:
B<==C
A<==B
A<==C

仔细观察是不是C.h被A.h include了两次(第一次是直接被include,第二次是C在B中,B在A中)。那么在一个代码文件中可以include另一个代码文件两次吗?明显是不可以的。那么有些小伙伴就要说了我不引用两次不就行了吗,我自己写代码的时候注意一下。但是如果是多人合作呢,多个程序员负责多个部分,最后代码合起来的时候就出现引用了两次某个代码文件是很正常的。

这个时候#ifndef就起作用了,假设我第一次引用某个代码文件的时候我在这个被引用的代码中创建一个宏名为DEFINE_X,那么我第二次引用这个代码文件的时候这个宏DEFINE_X肯定就已经存在了,那么假设我检测如果DEFINE_X已经存在那么第二次引用的这个代码文件我就不管它(可以看作被注释掉),这样是不是就可以避免被引用两次,示例如下:

#ifndef UNTITLED_TEST_H//第一次被引用时宏UNTITLED_TEST_H不存在,执行下列代码
#define UNTITLED_TEST_H//第一执行的时候会定义一个UNTITLED_TEST_H,等到第二次被引用的时候UNTITLED_TEST_H已存在,整个部分将被忽略

int add(int x, int y) {
    return x + y;
}

#endif //UNTITLED_TEST_H

如上例,我将test.h的所有函数定义,变量定义等放在#ifndef中,这样第一执行的时候会执行代码块,第二次将跳过。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值