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
- 20170214C语言提升06_宏
- 20170214C语言提升07_预编译指令
- 20170131C语言提升04_符号
- 20170203C语言提升05_编译
- 20170214C语言提升08_指针_01变量及指针及数组
- 20170131C语言提升03_条件语句
- C 语言编程提升
- C语言 类型提升
- C语言类型提升
- 20170128C语言提升01_数据本质和static和生命周期和作用域
- 20170128C语言提升02_结构体和union和void
- 20170215C语言提升08_指针_02数组指针及指针数组及函数指针
- C 语言提升资料专题
- C语言的类型提升
- C 语言中的整型提升
- C语言的类型提升
- C语言的类型提升
- c语言--回绕、整数提升
- [C#从入门到放弃]程序生命起点--Hello World
- Ubuntu 配置Java环境变量后 使用Java -version 提示 java已包含在下列软件包中 问题的解决方法
- org.apache.ibatis.exceptions.PersistenceException:解决方法
- 《Java 编程思想》第13章 字符串 笔记
- mac不能访问Linux上的tomcat
- 20170214C语言提升06_宏
- PAT乙级1025
- FragmentTabHost切换Fragment时避免重复加载UI
- 哪些人可以学前端开发?
- 如何把手头上的apk安装到电视上
- mac安装screen
- 【Android】安卓开发实战之自定义ActionBar(活动栏、状态栏)颜色且没有色差
- 递归与迭代的区别
- Android图片加载框架Picasso最全使用教程 二