#define宏定义(C语言)

目录

 

一.宏

二.宏定义

三.#define 替换规则

四,宏和函数对比

宏的优点

宏的缺点

五,练习巩固


一.宏

          宏(英语:Macro)是一种批量处理的称谓。 

          计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义规则替换一定的文本模式。解释器编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。

          宏这一术语也常常被用于许多类似的环境中,它们是源自宏展开的概念,这包括键盘宏和宏语言。绝大多数情况下,“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。

二.宏定义

        c程序提供的预处理功能之一。包括带参数的宏定义和不带参数的宏定义。具体是指用一个指定的标志符来进行简单的字符串替换或者进行阐述替换。形式为:
         #define标志符[(参数表)] 字符串

         #define name( parament-list ) stuff
        宏名
        在上定义中的标志符被称为“宏名”。
        宏展开
        在c程序编译时将宏名替换成字符串的过程称为“宏展开”。

三.#define 替换规则

   例:

//举个例子 !
#define MAX 1000
int main()
{
	int a = MAX;        // int a = 1000 ;
	printf("%d", a);
	return 0;
}
#define reg register          
//为 register这个关键字,创建一个简短的名字(不建议 降低代码可读性)
int main()
{
	reg int m;        //register int m ; 
	return 0;
}
#define do_forever for(;;)     //用更形象的符号来替换一种实现
int main()
{
	do_forever;       // for(;;);  // 实现死循环
	return 0;
}

  存在此类用法 , 但不建议这样使用 ,因为这样使用会大大降低代码的可读性!

代码分析:

有下面一串代码请分析运行结果:

#include<stdio.h>

#define SQUARE(x) x * x

int main()
{
	int a = SQUARE(5 + 5);
	printf("%d", a);
	return 0;
}

答案是: 35

刚开始,你可能觉得这段代码将打印的是 10 * 10 乘积的值。 事实上它将打印35. 为什么?

替换文本时,参数x被替换成 5 + 5, 所以这条语句实际上变成了:
printf("%d\n", 5 + 5 * 5 + 5);        //    5 + 25 + 5 = 35

提示:
所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用。
在程序中扩展#define定义符号和宏时,涉及步骤。
     1. 在调用宏时,首先对参数进行检查,看看是否包含任何由 #define 定义的符号。如果是,它们          首先被替换。
     2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。
     3. 最后,再次对结果文件进行扫描,看看它是否包含任何由 #define 定义的符号。如果是,就重          复上述处理过程。
注意:
      1. 宏参数和 #define 定义中可以出现其他 #define 定义的符号。但是对于宏,不能出现递归。
      2. 当预处理器搜索 #define 定义的符号的时候,字符串常量的内容并不被搜索。

四,宏和函数对比

  由于宏通常被应用于执行简单的运算,比如在两个数中找出较大较小值。 这个时候我们为什么不用函数来完成这个任务?
分析:

宏的优点

      1. 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。
          所以宏比函数在程序的规模和速度方面更胜一筹
      2. 更为重要的是函数的参数必须声明为特定的类型。
          所以函数只能在类型合适的表达式上使用。反之这个宏怎可以适用于整形、长整型、浮点型            等可以用于> 来比较的类型。
           宏是类型无关的
      3. 宏有时候可以做函数做不到的事情。比如:宏的参数可以出现 类型 ,但是函数做不到。
#include <stdio.h>
#include <stdlib.h>
#define MALLOC(num, type)(type *)malloc(num * sizeof(type))
int main()
{
	int* p;
	p = MALLOC(10, int);//类型作为参数 预处理器替换之后:
	//等同于 p = (int*)malloc(10 * sizeof(int));
	free(p);
	p = NULL;
	return 0;
}

宏的缺点

     1. 每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。
     2.  宏是没法调试的。
     3. 宏由于类型无关,也就不够严谨。 
     4. 宏可能会带来运算符优先级的问题,导致程容易出现错。

五,练习巩固

//题目1.
#include <stdio.h>
#define M(x,y) x-y
void main()
{
	int a = 4, b = 3, c = 5;
	printf("%d", a * M(b, c));
}
//A.8        B. 7
//C.编译错误  D. - 8



//题目2.
#include <stdio.h>
#define MIN(x,y) (x)<(y)?(x):(y)
	void main()
{
	int i, j, k;
	i = 10; j = 15;
	k = 10 * MIN(i, j);
	printf("%d\n", k);
}
//A.15      B. 10
//C.100     D. 150
   这两道题的答案是?欢迎评论区留言!
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值