宏定义

作者: 爱生活_更爱挺自己 | 来源:发表于2020-11-10 18:48 被阅读0次

宏定义

编译预处理指令

  • 开头的是便有意与处理指令

  • 他们不是C语言的成分,但是C语言程序离不开他们
  • define用来定义一个宏

#include<stdio.h>

#define PI 3.14159

int main(int argc, char const *argv[])
{
    printf("%f\n", 2*PI*3.0);
    
    return 0;
}
18.849540

#define

  • defin <名字> <值>

  • 注意没有结尾的分号,因为不是C的语句
  • 名字必须是一个单词,值可以是各种东西
  • 在C语言的编译器开始编译开始之前,编译预处理陈旭(cpp)会把程序中的名字换成值
    • 完全的文本替换

  • 如果一个宏的值中有其他宏的名字,也会被替换的
  • 如果一个宏的值超过一行,最后一行之前的行末需要加\
  • 宏的值后面出现的注释不会当做宏的值的一部分
#include<stdio.h>

#define PI 3.14159
#define FORMAT "%f\n"
#define PI2 2*PI

int main(int argc, char const *argv[])
{
    printf(FORMAT, PI2*3.0);

    return 0;
}
18.849540
#include<stdio.h>

#define PI 3.14159
#define FORMAT "%f\n"
#define PI2 2*PI
#define PRT printf("%f ",PI);\
            printf("%f\n",PI2)

int main(int argc, char const *argv[])
{
    //printf(FORMAT, PI2*3.0);
    PRT;

    return 0;
}
3.141590 6.283180

没有值的宏

  • define _DEBUG

  • 这类宏是用于条件编译的,后面有其他的编译预处理指令来检查这个宏是否已经被定义过了

预定义的宏

__LINE__   //行号
__FILE__   //文件名
__DATE__  //编译时候的日期 
__TIME__  //编译时候的时间
__STDC__


带参数的宏

像函数的宏

  • define cube(x) ((x) * (x) * (x))

  • 宏可以带参数
#include<stdio.h>

#define cube(x) ((x)*(x)*(x))

int main(int argc, char const *argv[])
{
    printf("%d\n", cube(5));
    
    return 0;
}
125

错误定义的宏

  • define RADTODEG(x) (x * 57.29578)

  • define RADTODEG(x) (x) * 57.29578

#include<stdio.h>

#define RADTODEG1(x) (x * 57.29578)
#define RADTODEG2(x) (x) * 57.29578
 int main(int argc, char const *argv[])
 {
     printf("%f\n", RADTODEG1(5+2));
     printf("%f\n", 180/RADTODEG2(1));
     return 0;
 }

119.591560
10313.240400

带参数的宏的原则

  • 一切都要括号

    • 整个值要括号
    • 参数出现的每个地方都要括号
  • define RADTODEG(x)((x)*57.29578)

待参数的宏

  • 可以带多个参数

    • define MIN(a,b)((a) > (b) ? (b):(a))

  • 也可以组合(嵌套)使用其他宏

  • 在大型程序的代码中使用非常普遍

  • 可以非常负载,如“产生”函数

    • 在#和##这两个运算符的帮助下
  • 存在中西方文化差异

  • 部分宏会被inline函数替代

相关文章

  • C语言 预处理指令

    一 .宏定义 #define 宏定义宏定义会在预处理的时候,用宏定义的值来替换宏的名称 定义格式 "#define...

  • swift&&OC

    宏定义 OC中的宏定义 swift中的宏定义 OC中宏定义的方式,在swift中是不可用的,在swift中,宏定义...

  • [iOS功能]- 宏定义

    单行宏定义 多行宏定义

  • 准备:回顾c

    宏定义 关键字 define 定义一个常量的方法(即宏定义) 带参数的宏定义 宏函数的定义 使用宏函数的好处是,不...

  • c高级自我学习(1)

    1 编译预处理和宏定 #undef指令删除前面定义的宏定义。 无参宏定义:宏名中没有参数。 1,宏定义中宏名用来表...

  • 5月31

    今天学习了宏定义 宏定义分为:不带参数的宏定义和带参数的宏定义,不占用任何内存空间,宏定义时不加分号。 #defi...

  • 总结

    宏定义:宏定义的分为无参宏定义与有参宏定义。无参宏定义的一般形式为:#define 标识符 字符串。‘#’表示...

  • 10/19

    今天老师讲了预处理命令,宏定义分为无参宏定义,带参宏定义和条件编译。宏定义包括宏名和宏展开,和函数相比预处理有很多...

  • C语言预处理指令

    预处理指令 宏定义 宏定义会在预处理的时候, 用宏定义的值来替换宏的名称 格式: #define 宏名称 宏值 应...

  • C语言学习:C语言宏定义

    学C语言很久了,但还是不敢用宏定义,大神喜欢用宏定义。关于宏定义你又了解多少了,下面我们说一下宏定义。 宏定义的概...

网友评论

      本文标题:宏定义

      本文链接:https://www.haomeiwen.com/subject/dggjbktx.html