#ifndef #define #endif

在做程设作业的过程中发现标答都会有一句#ifndef XXX 和 #endif,是什么意思呢?

这是#——预处理运算符的三种用法之一:条件编译
#的用法:
1、包含文件,如#include<stdio.h>
2、宏定义,如#define max_length 100
3、条件编译,如#ifndef、#endif

条件编译是什么意思呢
ifndef其实是if not define的缩写,如果没有定义,那就定义,直到endif

看一个例子:

#include <iostream>
using namespace std;

#ifndef max_length
#define max_length 50
#endif

#ifndef max_length
#define max_length 100
#endif

int main() {
    cout << max_length << endl;
    return 0;
}
那么输出结果显然是50了,由于max_length已经定义为50了,定义为100的部分没有执行。

当然这个用法还有避免重复包含头文件的作用,看这个例子
test_main.cpp:
#include <iostream>
using namespace std;

#include "test1.h"
#include "test.h"

int main() {
    test t;
    return 0;
}
test.h:
#include <iostream>
using namespace std;

#ifndef _TEST_H
#define _TEST_H

class test {
  public:
    test() {
        cout << "Test has been constructed." << endl;
    }
};

#endif
test1.h:
#include <iostream>
using namespace std;

#ifndef _TEST_H
#define _TEST_H

class test {
  public:
    test() {
        cout << "Test 1 has been constructed." << endl;
    }
};

#endif
注意在test_main中,我们先#include "test1.h",那么在下一个#include "test.h"中由于已经定义了_TEST_H标识,就不会再定义test.h里面的test类,注意一般标识的写法是下划线+头文件名大写+下划线+H,如_TEST_H,那么输出显然是:


假如调换#include "test1.h"和#include "test.h"的顺序:


还有一个有趣的现象,在因为已经定义而不会被编译的头文件里,就算有错误也没事,这是因为根本没被编译
注意下面是先#include "test.h"的

但是乱打的错误必须在标识内部:


还有一些奇怪的东西:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值