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后面不要有空格!