• 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
    ", __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

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

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

  • 相关阅读:
    敲七
    二维指针数组**p
    食物链(待解决)
    蛇行矩阵
    快速排序 QuickSort
    堆排序
    猪的安家
    百度语言翻译机
    HTML <base> 标签
    免费网络管理流量监控软件大比拼
  • 原文地址:https://www.cnblogs.com/straybirds/p/14790978.html
Copyright © 2020-2023  润新知