1. 什么是#ifndef和#define
在C和C++中,#ifndef和#define是预处理指令,用于防止头文件被重复引用。
#ifndef的全称是“if not defined”,如果后面的标识符没有被定义过,就执行后面的代码。#define用于给后面的标识符定义一个值,这个值可以是一个常量或者一个表达式。标识符定义后,可以在程序的其他位置使用它。通常情况下,#ifndef和#define会成对出现,用于防止头文件被重复引用。
下面是一个示例:
#ifndef _MYHEADER_H_
#define _MYHEADER_H_
//头文件内容
#endif //_MYHEADER_H_
上面的代码使用了_MYHEADER_H_来防止头文件被重复调用。如果_MYHEADER_H_已经被定义过了,#ifndef就不会执行头文件中的代码。如果_MYHEADER_H_没有被定义过,则会执行头文件中的代码,然后用#define来给_MYHEADER_H_定义一个值,防止头文件被重复调用。
2. #ifndef和#define的区别
2.1 功能
#ifndef和#define都是预处理指令,但是它们在功能上有所不同:
#ifndef用于判断一个标识符是否已经被定义过,如果已经被定义过了,就不执行后面的代码。
#define用于定义一个标识符的值。
2.2 使用方法
#ifndef和#define都是以“#”开头的预处理指令,使用方法如下:
#ifndef的使用方法:
#ifndef _MYHEADER_H_
#define _MYHEADER_H_
//头文件内容
#endif //_MYHEADER_H_
#define的使用方法:
#define PI 3.1415926
上面代码定义了一个常量PI,后面的代码可以使用PI来代替3.1415926。
3. 为什么要使用#ifndef和#define
使用#ifndef和#define可以避免头文件被重复引用,这样可以减少编译时间和内存占用。当一个头文件被重复引用时,编译器会把重复的部分编译多次,浪费时间和内存。而使用#ifndef和#define可以让编译器只编译一份头文件,然后在需要使用的地方引用它即可。
下面是一个示例:
假设有两个头文件:MyLib.h和MyProgram.h,它们都包含了stdlib.h。
如果不使用#ifndef和#define,代码如下:
//MyLib.h
#include
//MyProgram.h
#include
这样,编译器就会把stdlib.h编译两次,浪费时间和内存。
而如果使用#ifndef和#define,代码如下:
//MyLib.h
#ifndef _MYLIB_H_
#define _MYLIB_H_
#include
#endif //_MYLIB_H_
//MyProgram.h
#ifndef _MYPROGRAM_H_
#define _MYPROGRAM_H_
#include
#endif //_MYPROGRAM_H_
这样,编译器只会编译一次stdlib.h,然后在需要使用的地方引用它即可。
4. 总结
#ifndef和#define是C和C++中常用的预处理指令,用于防止头文件被重复引用。#ifndef用于判断一个标识符是否已经被定义过,如果已经被定义过了,就不执行后面的代码。#define用于定义一个标识符的值。使用#ifndef和#define可以避免头文件被重复引用,从而减少编译时间和内存占用。