C语言速记(宏)

宏是什么

计算机科学里的宏是一种抽象(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\n", __FILE__ );
   printf("Date :%s\n", __DATE__ );
   printf("Time :%s\n", __TIME__ );
   printf("Line :%d\n", __LINE__ );
   printf("ANSI :%d\n", __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!\n")

3.2,字符串常量化运算符(#),可将参数的名称直接输出

#include <stdio.h>

#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")

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\n", MAX(10, 20));  
   return 0;
}

结果:
Max between 20 and 10 is 20

 

宏函数参数是类型无关的,并且预编译器不做语法检查,容易出错,

优点:直接被替换效率高,不用反复调用像普通方法。

posted @ 2021-05-20 18:16  假程序猿  阅读(513)  评论(0编辑  收藏  举报