zoukankan      html  css  js  c++  java
  • 带参数的宏定义理解篇

    前言:最近在看一位叫朱有鹏大神的视频,讲的甚好。应此,我的感悟也因此被激发,准备针对朱老师将的内容,结合自己的理解,写一个系列的笔记博客~~大家可以去www.zhulaoshi.org观看视频~~

     

      带参数的宏定义,可以起到类似函数的效果,虽然看起来比定义函数简洁,但简洁的背后藏有陷阱,

    需要我们去注意。

    带参数的宏定义的一般形式如下:   

    #define 宏名(参数表) 宏体 

      单看“宏名(参数表)”这个部分就类似于一个“简写”的函数声明,之所以说是“简写”,

    那是因为,函数声明时,不管是函数名,还是参数名,都会带上类型,如:void add(int a , int b)

    {函数体};而用宏则是:#define add(a,b)  宏体  

      还需注意的是带参数的宏定义的参数表外面本来是有一个括号的,他的意义是表示这是这里是一个

    参数表,仅此而已。

     

    举一个简单的例子:

    #define add(a,b) a + b//定义部分

    c = add(a,b);//使用部分

    使用形式非常类似函数,但是他其实只是简单的替换add(a,b)被替换成了a + b。

     

    再来,举一个例子:

    #define SQR(x) (x*x)//定义部分

    b = 3;

    a = SQR(b+2)//使用部分,猜测一下结果是多少?

     

      在这个宏中,参数表中只有一个参数x,这样给人的感觉就是x是一个整体,而且还被一个括号括起来了。

    所以一看看去结果就是(3+2)*(3+2)结果是25.

    但是,前面已经强调过了参数表外边的括号,仅仅表示这是这里是一个参数表而已。所以真正的替换结果

    应该是3+2*3+2,所以编译后得到的结果是11.而不是我们期望的25(求平方的结果)。

    那么应该如何得到我们期望的结果呢?

      #define SQR((x)) (x*x) 为了强调x是一个整体我在参数表中将x外在加上一层括号。但是很可以这种

    语法是错误的参数表里只能是参数逗号和参数,不能有其他的东西。

    所以,正确的写法应该是 #define SQR(x) ((x)*(x)) 这样才会被替换成 (3+2)*(3+2)结果是25.

    但是,你说我就这么定义#define SQR(x) (x*x) 但是我使用的时候,这么写SQR((b+2)),这样写编译

    通过,而且得到的结果是25.

     

    总结:带参数的宏定义,虽然形式上简单,但是他其实还是简单的替换,所以在宏体中,能括起来的

    尽量都括起来。

  • 相关阅读:
    openfire学习4------->android客户端聊天开发之聊天功能开发
    MTD中的nand驱动初步分析---面向u-boot
    在线代码编缉器
    三个角度解构云计算,商业驱动or技术驱动?
    分布式存储的三个基本问题
    云计算核心技术
    云计算历史
    《信息产业指南》云计算解读
    2017云计算市场需要密切关注的10个趋势
    2017云计算机会
  • 原文地址:https://www.cnblogs.com/douzi2/p/4934126.html
Copyright © 2011-2022 走看看