C语言中宏的有关说明

C语言宏定义简单函数的好处?

因为调用函数要有参数压栈 过程记录保存 返回 过程记录的返回等额外开销  所以宏的效率一般要高些。

宏定义不占运行时间,只占编译时间。而函数调用则占运行时间。

宏就是在生成exe等可执行文件的时候就处理好了,函数则是在运行这个exe文件的时候才处理。
宏好比是去馆子吃饭,函数好比是自己买菜回家做饭

因为如果要有频繁的函数调用,增加了执行时的开销,效率不如宏,代码效率上宏和内联函数一样. 对于很短的函数,宏书写要简单一点(不需要写函数)

并且如你想修改下你代码中的值,你只需修改宏定义即可。

用#define  来定义,如#define  Max    100
优点:在以后的程序中 要修改Max的大小 不用跑到程序中找 直接修改
#define  Max    的大小即可。很方便。

主要用于函数重定义,通用性,可以用一个变量符号替代另一个变量符号
格式:#define M(x,y)  x+y
在主程序里写入z=M(6,9);等价于z=6+9;而写成z=(6-8,9);等价于z=6-8+9 ;直接代入
还有就是 :#define Uint  unsigned int 即用 Uint 代替unsigned int  便于书写,还有就是不同操作系统的通用变量识别

宏定义
     宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译
编辑本段1.不带参数的宏定义:
     宏定义又称为宏代换、宏替换,简称“宏”。
     格式搜索
     #define 标识符 字符串
     其中的标识符就是所谓的符号常量,也称为“宏名”。
     预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。
     掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。
     即在对相关命令或语句的含义和功能作具体分析之前就要换:
     例:
     #define PI 3.1415926
     把程序中出现的PI全部换成3.1415926
     说明:
     (1)宏名一般用大写
     (2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
     (3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
     (4)宏定义末尾不加分号
     (5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
     (6)可以用#undef命令终止宏定义的作用域
     (7)宏定义可以嵌套
     (8)字符串" "中永远不包含宏
     (9)宏定义不分配内存,变量定义分配内存。
编辑本段2.带参数的宏定义:
     除了一般的字符串替换,还要做参数代换
     格式:
     #define 宏名(参数表) 字符串
     例如:#define S(a,b) a*b
     area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;
     类似于函数调用,有一个哑实结合的过程:
     (1)实参如果是表达式容易出问题
     #define S(r) r*r
     area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;
     正确的宏定义是#define S(r) ((r)*(r))
     (2)宏名和参数的括号间不能有空格
     (3)宏替换只作替换,不做计算,不做表达式求解
     (4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存
     (5)宏的哑实结合不存在类型,也没有类型转换。
     (6)函数只有一个返回值,利用宏则可以设法得到多个值
     (7)宏展开使源程序变长,函数调用不会
     (8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值

C语言宏定义技巧(常用宏定义) 
 
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。

 

在提供布尔类型的高级语言当中,通常使用TRUE和FALSE来表示逻辑表达式运算的结果,但是在C语言当中没有布尔类型,所以用非零表示TRUE,用零表示FALSE

为了使这些代码的确切含义更为清楚,有利于阅读程序,可以使用两个宏进行定义:

#define TRUE  1

#define FALSE 0

恰当的使用C语言当中的预处理功能,能扩展C语言的编程环境,可以编写出易读、易改、便于移植和调试的C语言程序,有利于软件工程的模块化设计。

宏定义 文件包含 和条件编译 是C语言提供的三种预处理功能。

C语言的预处理程序负责分析和处理以#为首字符的预处理控制行。预处理控制行就是以上三种。

由于预处理是在编译系统开始工作之前进行的,所以将执行预处理功能的这部分程序称为预处理程序。

便于修改,阅读,扩充和移植程序。

从语法角度来说,预处理控制行并不属于真正的C语言的语句,他们可以出现在程序代码的任何地方,在他们的出现点后开始有效,通常宏替换和文件包含出现在文件的开头。预处理控制航的作用范围仅限于说明他们的文件,超出了该范围就失去作用。

 

#include<cstdio>
using namespace std;

#define MAX(a,b) a>b?a:b
#define ABS(x)   x>0?x:-x
#define CUB(x)   x*x*x
#define EVEN(x)  x%2==0?1:0
#define SWAP(m,n,t) t=n;n=m;m=t
#define SWAP2(m,n) m^=n;n^=m;m^=n
int main()
{
    printf("%d\n",MAX(5,6));
    printf("%d\n",ABS(-5));
    printf("%d\n",CUB(5));
    printf("%d\n",EVEN(5));
    int a = 5;
    int b = 6;
    int c;
    SWAP(a,b,c);
    printf("%d  %d\n",a,b);
    SWAP2(a,b);
    printf("%d  %d\n",a,b);
    return 0;
}


宏的一些使用

宏定义函数两个注意点:
1.#define 最后不要加“;”
2.最好把所有变量都加上括号

于是

#define MAX(a,b)  ((a)>(b)?(a):(b))

#define CUB(x)  ((x)*(x)*(x))

多加那些括号是必须的.
比如有宏定义  : fn(A,B) (A*B)
那么如果你在代码中写   fn(1+2, 3+4) 
那么预处理的结果就成了 1+2*3+4,

 

写一个“标准”宏MIN ,这个宏输入两个参数并返回较小的一个。 
#define MIN(A,B) ((A) <= (B) ? (A) : (B))

如果不加括号:写下面这段代码会发生什么
least = MIN(*p++, b);
 

 

加括号是为了处理表达式参数(即宏的参数可能是个算法表达式)时不出错,因为宏替换就是文本替换,所以如果有以下情况:

#define COM(A,B) (A)*(B)

那么COM(6+5,3)这个调用会怎么替换呢?它会换成这样:

(6+5)*(3)

显然这是和COM宏的意图一致的,但是如是去掉了定义中括号,即写成这样:

#define COM(A,B) A*B

那么COM(6+5,3)这个调用会怎么替换呢?它就会换成这样:

6+5*3

这样显然就和宏的意图不符合了。

但是你所写出的程序中的参数(即*p++和b)调用原程序的宏,这两种情况没区别.加括号是为了更通用。

 

来个指针的例子,比如说释放内存.
#define RELEASE_NEW_BUF(x) if(x){delete x;x=NULL;}
注意RELEASE_NEW_BUF后面不要有空格!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值