zoukankan      html  css  js  c++  java
  • 十四、程序结构(2)——宏

    编译预处理指令

    (1)#开头的是编译预处理指令

    (2)它们不是C语言的成分,但是C语言程序离不开它们

    (3)#define用来定义一个宏

    #define
    #define <名字>  <值>

    (1)注意没有结尾的分号,因为不是C的语句

    (2)名字必须是一个单词,值可以是各种的东西

    (3)在C语言的编译器开始编译之前,编译预处理程序(cpp)会把程序中的名字换成值

    ——完全的文本替换

    (4)gcc-save-temps

    (1)如果一个宏的值中有其他的宏的名字,也是会被替换的

    (2)如果一个宏的值超过一行,最后一行之前的行末需要加

    (3)宏的值后面出现的注释不会被当做宏的值的一部分

    没有值的宏
    #define _DEBUG

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

    预定义的宏
    _LINE_
    _FILE_
    _DATE_
    _TIME_
    _STDC_

    带参数的宏

    像函数的宏
    #define cube(x) ((x)*(x)*(x))

    宏可以带参数

    错误定义的宏
    #define  RADTODEG(x)(x*57.29578)
    #define  RADTODEG(x)(x)*57.29578
    带参数的宏的原则

    一切都要括号

    ——整个值要括号

    ——参数出现的每个地方都要括号

    #define  RADTODEG(x) ((x)*57.29578)
    带参数的宏

    (1)可以带多个参数

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

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

    分号?

    #define  PRETTY_PRINT(msg) printf(msg);
    
    if(n<10)
         PRETTY_PRINT("n is less than 10");
    else
          PRETTY_PRINT("n is at less  10");
    带参数的宏

    (1)在大型程序的代码中使用非常普遍

    (2)可以非常复杂,如“产生”函数的帮助下

    ——在#和##这两个运算符

    (3)存在中西方文化差异

    (4)部分宏会被inline函数替代

    其他编译预处理指令

    (1)条件编译

    (2)error

    ...

  • 相关阅读:
    用友U8 | 【存货管理】提示用户***正在记账,不允许并发。
    用友U8 | 怎么准确查找【采购入库单】、【采购发票】,对应的凭证号?
    用友U8 | 中途启用序列号管理,该怎么操作?
    Excel:提取身份证号中的性别
    给jupyter 添加代码自动补全功能
    SQL函数之:截断字符串
    解决Maven子项目提示 ‘parent.relativePath‘ of POM
    公共NTP资源汇总
    iperf3的使用
    ZeroTier的使用
  • 原文地址:https://www.cnblogs.com/Strugglinggirl/p/9080408.html
Copyright © 2011-2022 走看看