精华内容
下载资源
问答
  • 宏定义函数

    千次阅读 2020-08-29 18:56:39
    概念 在预编译阶段完成代码替换。 优势 (1)增加代码的可读性: 宏定义的优点很多,但我个人理解宏定义最明显的优点...宏定义函数的参数没有数据类型,因此可轻松实现模板函数的功能 #define MAX(a, b) (a > b ? a

    概念

    在预编译阶段完成代码替换。

    优势

    (1)增加代码的可读性:

    宏定义的优点很多,但我个人理解宏定义最明显的优点就是增加代码的可读性。求圆的面积, 用“PI * r* r”比 “3.14r”的可读性就强很多了。

    #define PI 3.14
    
    float circleArea(float r) {
      return PI * r * r;
    }
    

    (2)自带“模版函数”的buff:

    宏定义函数的参数没有数据类型,因此可轻松实现模板函数的功能

    #define MAX(a, b) (a > b ? a : b)
    
    std::cout << "max of a and b is: " << MAX(1, 2)  << std::endl;
    std::cout << "max of a and b is: " << MAX(1.5, 2.1) << std::endl;
    

    (3)相比于正常函数,宏定义函数性能更快

    宏定义的本质决定了这个优势,宏定义只是在代码编译阶段做一个简单的替换,没有任何语法和优化的空间,因此宏定义函数没有正常函数所需的开销,包括:开辟空间,记录返回地址,形参压栈,从函数中返回释放堆栈。

    缺点#define SUM(a,b) a+b

    • 1 宏定义函数只能完成一些简单的替换,因此他的使用场景是有限制的,即使是宏定义函数, 也只是完成简单的功能, 不能真正的替代函数。
    • 2 由于只是做一个替换,因此使用的时候需要谨慎,避免出现符号优先级而出现的低级错误。
    #define SUM(a,b) a+b
    std::cout << "area of rectangle: " << 2 * SUM(1, 2) << std::endl;
    // 打印的结果是4, 而不是6.因此替换后的代码:
    2 * 1 + 2, 而不是2 *1+ 2

    一个惯用的用法

    用do{}while(0)包裹宏定义函数中的代码,这样的好处就是方便实现很复杂的宏定义函数,还可以把这个宏定义函数伪装成一个正常的函数去执行。
    如下例:

    #define UNIT_AREA(shape)               \
      do {                                 \
        if (shape == "circle") {           \
          std::cout << PI << std::endl;    \
        } else if ( shape == "square") {   \
          std::cout << "1" << std::endl;   \
        } else {                           \
          std::cout << "1.0" << std::endl; \
        }                                  \
      } while(0)
     
     std::cout << "area of unit area: " << std::endl;
     UNIT_AREA("circle");
    

    宏定义函数中的特殊符号

    (1) …和__VA__ARGS__

    支持宏定义就函数中的可变参数,宏定义参数可变,或者部分参数可变。
    使用“…”配合“VA_ARGS”。

    #define  LOG(...) {printf("%s\n", __VA_ARGS__);}
    #define  ERROR_LOG(x, ...) if (x) {printf("%s\n", __VA_ARGS__);}
    
    // 以下代码皆可执行
     LOG("this is log")
     LOG("this is log");
     ERROR_LOG(1, "this is error log");
     {printf("log");}
     {printf("log");};
    

    连接符:##

    待写

    展开全文
  • C语言位操作宏定义函数

    万次阅读 2021-06-18 15:48:54
    位操作宏定义 我们在写C语言时,经常需要用到位操作,但是每次自己使用逻辑运算符进行操作的时候,很费脑子,试试下面几个宏定义吧: #define GET_BIT(value,bit) ((value)&(1<<(bit))) //读取指定位 #...

    位操作宏定义

    我们在写C语言时,经常需要用到位操作,但是每次自己使用逻辑运算符进行操作的时候,很费脑子,试试下面几个宏定义吧:

    #define GET_BIT(value,bit) ((value)&(1<<(bit)))    //读取指定位
    #define CPL_BIT(value,bit) ((value)^=(1<<(bit)))   //取反指定位
    
    #define SET0_BIT(value,bit) ((value)&=~(1<<(bit))) //把某个位置0
    #define SET1_BIT(value,bit) ((value)|= (1<<(bit))) //把某个位置1
    

    位操作函数

    这4个宏定义已经可以在大部分场合使用了,但是这个4个宏定义貌似功能也没事很全。
    比如要操作寄存器的某些位,但是又不改变其他位怎么办呢,试试如下的函数吧:

    //设置数据的某些位的值
    /*
    value 需要设置的数据的指针
    bitl 需要设置的位的低位
    bith 需要设置的位的高位
    data 需要设置的数据
    */
    
    void SET_DATA(unsigned int *value,unsigned int bitl,unsigned int bith,unsigned int data)
    {
        unsigned int* v = value;
        if(bitl<=bith)  
        {
            unsigned int bcount = bith-bitl+1;
            unsigned int cbit=0;
            unsigned int cdata=0;
            for(unsigned int i=0;i<bcount;i++)
            {
                cdata |=(1<<i);
                cbit  |=(1<<(bitl+i));
            }
            (*v)  &=~(cbit); 
            (*v)  |=((data&cdata)<<bitl); 
        }
    }
    

    使用方法: 例如 变量Value 的初始值为0xFF,要设置Value 的 0 到 5位 为 2 ,那么就调用函数:

    	int Value = 0xFF;
    	SET_DATA(&Value,0,5,2);
    
    展开全文
  • 要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。
  • 宏定义函数和普通函数

    千次阅读 2017-06-04 16:21:23
    宏定义函数: 预处理阶段进行简单的文本替换,没有入栈、出栈、参数传递和函数返回等等工作,执行效率明显高于普通函数,因此,简短并且被频繁调用的函数经常用宏定义函数来代替实现 没有参数检查,会影响程序安全 ...

    宏定义函数:

    • 预处理阶段进行简单的文本替换,没有入栈、出栈、参数传递和函数返回等等工作,执行效率明显高于普通函数,因此,简短并且被频繁调用的函数经常用宏定义函数来代替实现
    • 没有参数检查,会影响程序安全
    • 如果函数比较复杂,函数体规模比较大,使用宏定义函数就会增加程序的大小
    • 宏定义函数的调用有可能改变函数的原生语义,比如涉及到运算符优先级的函数时,调用宏定义函数可能会改变函数的原生语义,所以使用时要格外小心

    普通函数:

    • 具有参数检查,压栈,出栈,参数传递等工作,程序更加安全,但是执行效率会低于宏定义函数
    • 函数体只会存在一个,每次调用都会转向函数体的位置执行函数功能,适合复杂函数的定义
    展开全文
  • C++宏定义函数

    2019-10-08 14:29:24
    C++宏定义函数 宏允许带有参数,参数包含形参和实参,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,无参宏的宏名后不带参数,其定义的一般形式为: #define 标识符 字符串; 例如#define m a*b;...

    C++宏定义函数

    宏允许带有参数,参数包含形参和实参,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,无参宏的宏名后不带参数,其定义的一般形式为:

    • #define 标识符 字符串; 例如#define m a*b;
      • 其中ab的值就是m,在主函数中m就是调用ab;
    • 带参宏定义的一般形式:
      • #define 宏名(参数表) 字符串;
        • 在字符串中含有各个形参。
        • 带参宏调用的一般形式为:
        • 如:#define swap(a,b) t=a,a=b,b=t;//交换两个数的宏定义函数
        • 宏名(实参表),其中a,b就是实参,通过在主函数中输入,然后通过宏定义的预处理,也就是后面的字符串(t=a,a=b,b=t)来运算,在主函数中得到调用。
        • 主函数:
    int main(){
    	int a,b,t;
    	cin >> a >> b;
    	swap(a,b);
    	cout << a << b ;
    }
    

    宏定义该概念 详情参考:宏定义详情

    展开全文
  • 尽管函数宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数宏定义来代替实现...
  • 最近在看别人的代码的过程中,发现了宏定义代码,由于自己这块之前没有用过,所以编写了示例程序,学习一下宏定义代码。...那有没有一种更加通用的方式呢,宏定义函数给了我们一种选择,示例如下...
  • 宏定义函数与普通函数的区别

    千次阅读 2017-10-17 23:23:48
    #define MAX(a,b) ((a)>(b)?(a):(b)) int MAX1(int a,int b) { return a>b?a:b; ...1)宏定义函数没有参数类型也不做类型检查,预编译...2)宏定义函数时一定要注意括号的存在和匹配,有时会因为 括号的不存在就会导致
  • 宏定义函数的优势和性质特点,是否宏定义函数也可以传递参数?将宏定义所有性质说明一下
  • 内联函数和宏定义函数的区别

    千次阅读 2019-05-17 19:53:55
    1、不同点: 内联函数是在编译时展开,而宏在预编译时展开;在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换。 ... inline有点类似于宏定义,但是它和宏定义不同...
  • iOS 使用宏定义函数和代码块

    千次阅读 2018-01-18 10:53:40
    iOS使用宏定义函数和代码块 今天在开发过程中碰到一个问题:就是父类中要向外发送通知,然后子类中或者其他类中来接收它。当然一般是把它写到类方法中去,但是有个问题,就是如果调用的类不是它的子类,就不能直接...
  • 关于C语言刷题(#define宏定义函数的常见错误) 首先我们来先看对#define的定义 define,宏定义,C语言中预处理命令一种。分为无参宏定义和带参宏定义。无参宏定义的一般形式为:#define 宏名 字符串;带参宏定义的...
  • 使用宏定义函数进行求解2数最大 #define MAX(a,b) \ ((a)>(b)?(a):(b)) 使用内联函数进行求解2数最大 inline int max(int a,int b){ return a>b?a:b; } 相当于就是个函数宏定义 和宏定义的性能开销相似...
  • C语言:宏定义函数

    万次阅读 多人点赞 2019-03-18 11:40:46
    通过一个比较函数的例子来说明宏函数和普通函数的区别: 宏函数形式: #define MAX( a, b) ( (a) &gt; (b) (a) : (b) ) //这里为什么有这么多括号,后面会讲 普通函数形式: int max(int a, int b) { ...
  • 关于一些无法被代替的宏定义函数

    千次阅读 2013-08-04 18:56:38
    在cocos2d有一个宏定义函数:CREATE_FUNC(func) 该宏做能放到类中使用,作用就是生成一个 返回一个该类指针的函数。 但因为 宏定义函数 有很多限制和危险性,所以我曾想用 继承模板类的方法代替这种宏定义函数: ...
  • 为什么要用宏定义函数

    千次阅读 2019-08-01 17:00:36
    代码本身不是函数,但使用起来象函数。 预处理器用复制代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、 返回参数、执行return等过程,从而提高了速度。 使用代码最大的缺点是容易出错,预...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 321,305
精华内容 128,522
关键字:

宏定义函数