20170214C语言提升06_宏

宏:

1:宏经常用来定义常量,宏在编译器预处理的时候会被展开,我们可以使用宏来代替一些逻辑

例如:

#include<stdio.h>
    #define MAXSIZE 255
    #define BEGIN {
    #define END }
    #define FOREACH for(i = 0; i<size; i++)

int main()
{
	int i = 0, size = 100;
	FOREACH
	BEGIN
		printf("%d\r\n", i);
	END
	return 0;
}

2:宏里面还可以接收占位符!这种宏称之为函数宏!!

#include<stdio.h>
    #define size 255
    #define BEGIN {
    #define END }
    #define FOREACH(a,b) for(a = 0; a<b; a++)

int main()
{
	int i = 0, size = 100;
	FOREACH(i, size)
	BEGIN
		printf("%d\r\n", i);
	END
	return 0;
}

    函数宏相当于可以接收参数的传入,他会替换。但是printf()的时候还是要使用原本的参数,不可以使用a和b,a和b只是占位符。
    宏无论定义在什么地方,在定义宏代码后面左右的地方都可以再使用这个宏,与定义在函数里面还是外面无关。
    宏定以后还可以使用#undef来注销掉。

    系统也提供有一些默认好的宏。

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 255
#define BEGIN {
#define END }
#define FOREACH(a,b) for(a;a<b;a++)
#define SUM(a,b) a+b
#define DIM(a) sizeof(a)/sizeof(*a)
#define MALLOC(type,x) (type*)malloc(sizeof(type)*x)
//所有的宏都是纯粹的替换,所以有的时候也容易出问题。例如:
#define MAX(a,b) a>b?a:b

int main()
{
	int array[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
	int i = 0;
	FOREACH(i, DIM(array))
		BEGIN
		printf("%d\r\n", SUM(array[i], array[SUM(i, 1)]));
	END//打印3 5 7 9 11 13 15 ?(未定义值)

	int *p = malloc(sizeof(int) * 5);
	int *pp = MALLOC(int, 5);

	int a = 3, b = 2, c = 1;
	printf("%d", MAX(a, MAX(b, c)));//这里没出问题,打印的3。
	// a>  b>c?b:c ?  a  :  b>c?b:c		//大于的优先级会比三目运算符高!容易出问题。
#undef MAX
	//printf("%d", MAX(a, b));//这句话无法再调用MAX这个宏
	printf("%s\r\n", __FILE__);
	printf("%d\r\n", __LINE__);
	printf("%s\r\n", __DATE__);//任何一个编译器都可以用这三个默认的宏
	return 0;
}//写宏的时候一定要注意优先级的问题,出错也经常是因为优先级出错。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值