宏是什么
计算机科学里的宏是一种抽象(Abstraction),
它根据一系列预定义的规则替换一定的文本模式。
解释器或编译器在遇到宏时会自动进行这一模式替换。
对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。
绝大多数情况下,“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。
个人理解,
大体就是用简单标识预设一些操作,在程序真正执行前将执行操作带人。
有时候又叫宏语言,有自己的语法:表现上宏变量和宏函数。
在c语言中,用define定义宏,可以达到常规语法的常量和方法的效果。
为什么不直接叫常量和方法,
个人觉得是宏本身是单独的一个概念,然后引进到C语言中,虽然和C语言语法结构有类似,但有其独立存在概念。
1,用#define 定义常量来增强可读性
#define MAX_ARRAY_LENGTH 20
2,预定义宏
在编程中您可以使用这些宏 __DATE__ 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。 __TIME__ 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。 __FILE__ 这会包含当前文件名,一个字符串常量。 __LINE__ 这会包含当前行号,一个十进制常量。 __STDC__ 当编译器以 ANSI 标准编译时,则定义为 1。
#include <stdio.h> main() { printf("File :%s ", __FILE__ ); printf("Date :%s ", __DATE__ ); printf("Time :%s ", __TIME__ ); printf("Line :%d ", __LINE__ ); printf("ANSI :%d ", __STDC__ ); }
输出:
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1
3,创建宏使用到的运算符
3.1宏延续运算符:反斜杠()
#define message_for(a, b) printf(#a " and " #b ": We love you! ")
3.2,字符串常量化运算符(#),可将参数的名称直接输出
#include <stdio.h> #define message_for(a, b) printf(#a " and " #b ": We love you! ") int main(void) { message_for(Carole, Debra); return 0; }
输出:
Carole and Debra: We love you!
3.3,标记粘贴运算符(##):可以将变量值和某个名称合并称为一个需要的变量名称
#include <stdio.h> #define tokenpaster(n) printf ("token" #n " = %d", token##n) int main(void) { int token34 = 40; tokenpaster(34); return 0; }
结果:
token34 = 40 相当于:printf ("token34 = %d", token34);
4,宏函数,又叫参数化宏
#define square(x) ((x) * (x)) 相当于如下函数效果: int square(int x) { return x * x; } 只是宏函数,不需要定义参数和返回类型
必须使用 #define 指令定义。参数列表是括在圆括号内,且必须紧跟在宏名称的后边。宏名称和左圆括号之间不允许有空格。
#include <stdio.h> #define MAX(x,y) ((x) > (y) ? (x) : (y)) int main(void) { printf("Max between 20 and 10 is %d ", MAX(10, 20)); return 0; } 结果: Max between 20 and 10 is 20
宏函数参数是类型无关的,并且预编译器不做语法检查,容易出错,
优点:直接被替换效率高,不用反复调用像普通方法。