c++中define用法

#define

将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本

该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义

#define   <宏名>  <字符串>

#define PI 3.1415926


#define   <宏名> (<参数表>)   <宏体>

#define   A(x) x

在程序被编译前,先将宏名用被定义的字符串替换然后才进行编译,宏替换是简单的替换


运行时机

c语言或c++运行经过以下阶段

               (预处理)                                 (编译)                          (汇编)                                      (链接)
源程序------------>修改后的源程序------------->汇编程序----------->可重定位的目标程序------------->可执行目标程序

预处理主要进行如下步骤替换

以把源程序中的#include 扩展为文件正文,即把包含的.h文件找到并展开到#include 所在处

预处理器根据#if和#ifdef等编译命令及其后的条件,将源程序中的某部分包含进来或排除在外,通常把排除在外的语句转换成空行

预处理器将源程序文件中出现的对宏的引用展开成相应的宏定义,即本文所说的#define的功能,由预处理器来完成。经过预处理器处理的源程序与之前的源程序有所有不同,在这个阶段所进行的工作只是纯粹的替换与展开,没有任何计算功能,所以在学习#define命令时只要能真正理解这一点,这样才不会对此命令引起误解并误用

原则:先替换再计算

#include<iostream>
using namespace std;
#define Max 100
#define N 2+2
#define M (2+2)
int i=1;
int main(){
        
        cout<<"Max is "<<Max<<endl;
        cout<<"N*N is "<<N*N<<endl;//2+2*2+2
        cout<<"M*M is "<<M*M<<endl;//(2+2)*(2+2)
        system("pause");
        return 0;
}

输出:

Max is 100

N*N is 8

M*M is 16

注意事项

要想能够真正使用好宏定义,一定要记住先将程序中对宏的使用全部替换成它所代表的字符串

在编程使用宏替换时,当字符串中不只一个符号时,加上括号表现出优先级

如果是带参数的宏定义,则要给宏体中的每个参数加上括号,并在整个宏体上再加一个括号。

例:

写一个标准的宏MIN,这个宏有两个参数,返回较小值

#define MIN(a,b)  ((a)>(b)?(b):(a))    //每一个参数都要用括号括起来,总体也要放在括号中

使用宏的优点

方便程序的修改

提高效率

使用带参数的宏定义可完成函数调用的功能,又能减少系统开销,提高运行效率。正如C语言中所讲,函数的使用可以使程序更加模块化,便于组织,而且可重复利用,但在发生函数调用时,需要保留调用函数的现场,以便子函数执行结束后能返回继续执行,同样在子函数执行完后要恢复调用函数的现场,这都需要一定的时间,如果子函数执行的操作比较多,这种转换时间开销可以忽略,但如果子函数完成的功能比较少,甚至于只完成一点操作,如一个乘法语句的操作,则这部分转换开销就相对较大了,但使用带参数的宏定义就不会出现这个问题,因为它是在预处理阶段即进行了宏展开,在执行时不需要转换,即在当地执行。宏定义可完成简单的操作,但复杂的操作还是要由函数调用来完成,而且宏定义所占用的目标代码空间相对较大。所以在使用时要依据具体情况来决定是否使用宏定义。



define的用法与注意事项 - 宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒 - C++博客



转载于:https://my.oschina.net/hnuweiwei/blog/233184

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值