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

转载 2018年04月16日 20:58:04

像函数的宏

  • #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

预处理(宏定义、文件包含、条件编译)

预处理(pre-treatment),是指在进行最后加工完善以前进行的准备过程,具体应用在不同的行业或领域,会有不同的解释。       一、含义 程序设计中的预处理(Preprocess),程序...
  • bzhxuexi
  • bzhxuexi
  • 2013-10-18 16:09:20
  • 3771

C语言的宏之带参数宏

C语言的宏之带参数宏 引言C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这种宏外形和作用与函数类似,即类函数宏。但是它的行为和函数调用完全不同。对带参数的宏,在...
  • libing403
  • libing403
  • 2017-06-10 01:59:46
  • 886

gcc中调试代码常用的宏

红色是比较常用的 宏 意义 __FILE__       本文件名 __LINE__ 本行位于该文件的第几行 __FUNCTION__ 函数...
  • xtx1990
  • xtx1990
  • 2012-08-08 17:08:04
  • 573

如何定义一个带参数的宏

开发中我们经常会遇到一些需要封装起来的简单函数 比如说:有两个数,通过调用一个宏去返回较大的数               或者:通过输入三原色(RGB)的值去输出一个自己的颜色 这中做法比较常...
  • withStyle
  • withStyle
  • 2015-12-23 01:01:04
  • 1306

c++ 带参数的宏定义 实现反射机制

lua 这种脚本语言用久了,总觉得反射机制就应该理所当然的嵌入在语言特性里。 比如希望根据自己传的类名变量,动态去 new 一些实例。在 lua ,js 里做起来就非常简单,然而在 c++里面做起来,...
  • korekara88730
  • korekara88730
  • 2017-04-03 00:45:46
  • 409

带参数的宏与函数的区别

1.函数调用时,先求出实参表达式的值,然后带入形参。而使用带参的宏只是进行简单的字符替换。 2.函数调用是在程序运行时处理的,分配临时的内存单元;而宏展开则是在编译时进行的,在展开时并不分配内存单元...
  • baoendemao
  • baoendemao
  • 2014-11-16 09:43:44
  • 1481

含参数的宏与函数的区别

?         宏替换不占运行时间,只占编译时间;而函数调用则占运行时间(分配单元、保留现场、值传递、返回),所以每次执行都要载入所以执行起来比较慢一些。。 ?         定义宏的时候...
  • u011775691
  • u011775691
  • 2014-03-14 18:10:45
  • 798

定义两个带参的宏,一个用来求area, 另一个宏用来求S

题目描述 三角形面积=SQRT(S*(S-a)*(S-b)*(S-c)) 其中S=(a+b+c)/2,a、b、c为三角形的三边。 定义两个带参的宏,一个用来求area, 另一个宏用来求S。 写程序,...
  • m0_37345402
  • m0_37345402
  • 2017-10-17 22:50:00
  • 357

C语言带参宏定义

C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这点和函数有些类似。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。带参宏定义的一般形式为: #de...
  • swpu_yx32
  • swpu_yx32
  • 2016-10-19 13:37:52
  • 3032

C++ 带有参数的宏定义

宏定义中 多行时用"\"换行。 #define CHECKFILE(state, path) \ if (!state) \ {\ ...
  • AriesSurfer
  • AriesSurfer
  • 2012-11-09 21:59:04
  • 4363
收藏助手
不良信息举报
您举报文章:编译预处理和宏:带参数的宏
举报原因:
原因补充:

(最多只允许输入30个字)