编译预处理和宏:带参数的宏

像函数的宏

  • #define cube(x) ((x)(x)(x))
  • 宏可以带参数
#include<stdio.h>

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

int main(){
    int i;
    scanf("%d".&i);
    printf("%d\n",cube(i));//替换成 printf("%d\n",((i)*(i)*(i)));
return 0;
}

错误定义的宏

  • #define RADTODEG(x) (x*57.29578)
  • #define RADTODEG(x) (x)*57.29578
 #define RADTODEG(x)  (x*57.29578)
 #define RADTODEG(x) (x)*57.29578
int main(){
    printf("%f\n",RADTODEG1(5+2));   //printf("%f\n",(5+2*57.29578));
    printf("%f\n",180/RADTODEG2(1));  //printf("%f\n",180/(1)*57.29578);

    return 0;
}

//Result:
//119.591560
//10313.240400

带参数的宏的原则

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

带参数的宏

-可以带多个参数
- #define MIN(a,b) ((a)>(b)?(b):(a))
-也可以组合(嵌套)使用其他宏

分号?

#define PRETTY_PRINT(msg) printf(msg);
if(n<10)
    PRETTY_PRINT("n is less than 10");
else
    PRETTY_PRINT("n is at least 10");
//若这样写,else将永不会被执行 ;;,而且会报错
//因为define 里自带了一个分号,if只执行其后一句,另一句不是if的子语句

带参数的宏

  • 在大型程序中的代码中使用非常普遍
  • 可以非常复杂,如“产生”函数
    • 在#和##这两个运算符的帮助下
  • 存在中西方文化差异
  • 部分宏会被inline函数替代

其他编译预处理指令

  • 条件编译
  • error
阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页