宏定义

预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作。说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变的很精短。
关于预处理命令中的文件包含(#include),宏定义(#define)。

【预热】先介绍例子显示#define、#ifdef、#ifndef的简单用法

//代码举例:新建define.cpp文件
#include <iostream>
using namespace std;
int main()
{
    #ifdef DEBUG      
    cout<< "Beginning execution of main()";
    #endif      
    return 0;
}
运行结果为:Press any key to continue

#include <iostream>
using namespace std;
#define DEBUG     //【注】添加该行
int main()
{
    #ifdef DEBUG      
    cout<< "Beginning execution of main()"<<endl;
    #endif       
    return 0;
}
运行结果为:Beginning execution of main()
          Press any key to continue
更一般的情况是,#define语句是包含在一个特定的"头文件"中。
//比如,新建头文件head.h,在文件中加入代码:
#ifndef DEBUG 
#define DEBUG
#endif
//而在define.cpp源文件中,代码修改如下:
#include <iostream>
#include "head.h"
using namespace std;
int main()
{
    #ifdef DEBUG      
    cout<< "Beginning execution of main()";
    #endif       
    return 0;
}
运行结果如下:Beginning execution of main()
            Press any key to continue 

预处理命令之条件编译的三种情况(#ifdef,#ifndef,#else,#endif,#if等)

以下分3种情况:
1:情况1#ifdef _XXXX
程序段1
#else
程序段2
#endif
//这表明如果标识符_XXXX已被#define命令定义过就对程序段1进行编译;否则对程序段2进行编译。
例: 
#define NUM
.............
.............
#ifdef NUM
   printf("之前NUM有过定义啦!:) \n");
#else
   printf("之前NUM没有过定义!:( \n");
#endif
}
因为程序开头有#define NUM这行,即NUM有定义,碰到下面#ifdef NUM的时候,当然执行第一个printf。否则执行第二个printf。
【用途】我认为,用这种,可以很方便的“开启/关闭整个程序的某项特定功能”。

2:情况2#ifndef _XXXX 
程序段1
#else 
程序段2
#endif
//这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。例子就不举了。

3:情况3#if 常量 
程序段1
#else
程序段2
#endif 
//这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。
【用途】我认为,这种方法可以将测试代码加进来。当需要开启测试的时候,只要将常量变1就好了。而不要测试的时候,只要将常量变0

文件中的#ifndef

头件的中的#ifndef,这是一个很关键的东西。
//比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:
#ifndef <标识> 
#define <标识>
...... 
......
#endif
<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,
如:stdio.h
#ifndef _STDIO_H_ 
#define _STDIO_H_
......
#endif

[注意]在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。
#ifndef AAA
#define AAA
...
int i;
...
#endif
里面有一个变量定义
在vc中链接时就出现了i重复定义的错误,而在c中成功编译。

注意问题:变量一般不要定义在.h文件中。
解决方法:.h中只声明 extern int i;在.cpp中定义
例如:
<x.h>
#ifndef __X_H__
#define __X_H__
extern int i;  //在头文件中声明变量
#endif //__X_H__
<x.c>
int i;   //在.c文件中定义变量

ifndef/define/endif的用法与实例分析

//终于讲到常见的防止重定义的ifndef/define/endif
假设你的工程里面有4个文件,分别是a.cpp,b.h,c.h,d.h 
a.cpp的头部是:
#include "b.h " 
#include "c.h "
b.h和c.h的头部都是: 
#include "d.h "
而d.h里面有class D的定义。
这样一来, 
编译器编译a.cpp的时候,先根据#include "b.h "去编译b.h这个问题,再根据b.h里面的#include "d.h ",去编译d.h的这个文件,这样就把d.h里面的class D编译了;然后再根据a.cpp的第二句#include "c.h ",去编译c.h,最终还是会找到的d.h里面的class D,但是class D之前已经编译过了,所以就会报重定义错误。
加上ifndef/define/endif,就可以防止这种重定义错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值