20170214C语言提升06_宏

来源:互联网 发布:有抢购软件吗 编辑:程序博客网 时间:2024/06/03 12:34

宏:

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;FOREACHBEGINprintf("%d\r\n", i);ENDreturn 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)BEGINprintf("%d\r\n", i);ENDreturn 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:bint main(){int array[] = { 1, 2, 3, 4, 5, 6, 7, 8 };int i = 0;FOREACH(i, DIM(array))BEGINprintf("%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