主题六 函数(C语言核心)----35.函数VS宏

来源:互联网 发布:ubuntu pyqt4下载 编辑:程序博客网 时间:2024/06/05 18:24
#include <stdio.h>#define RESET(p, len) while( len > 0) ((char*)p)[--len] = 0void reset(void* p, int len){    while( len > 0 )     {        ((char*)p)[--len] = 0;    }}int main(){    int array[] = {1, 2, 3, 4, 5};    int len = sizeof(array);        reset(array, len);    RESET(array, len);        return 0;}


宏的优点和缺点

宏的效率比函数稍高,但是其副作用巨大,容易出错


#include <stdio.h>#define ADD(a, b) a + b#define MUL(a, b) a * b#define _MIN_(a, b) ((a) < (b) ? (a) : (b))int main(){    int i = 1;    int j = 10;        printf("%d\n", MUL(ADD(1, 2), ADD(3, 4)));    printf("%d\n", _MIN_(i++, j));        return 0;}//output:11,2//gcc -E test.c -o test.i   1+2*3+4=11,((i++)<=(j)?(i++):(j))

函数优点和缺点

函数存在实参到形参的传递,因此无任何副作用,但是函数需要建立活动对象,效率受到影响

 

宏无可代替的优势

宏参数可以是任何C语言实体,宏编写的_MIN_参数类型可以是int,float等等,宏的参数可以是类型名

#define MALLOC(type,n)  (type*)malloc(n*sizeof(type))#include <stdio.h>#include <malloc.h>#define MALLOC(type, n) (type*)malloc(n * sizeof(type))int main(){    int* p = MALLOC(int, 5);        int i = 0;        for(i=0; i<5; i++)    {        p[i] = i + 1;                printf("%d\n", p[i]);    }        free(p);        return 0;}

小结

宏和函数并不是竞争对手

宏能够接受任何类型的参数,效率高,但易出错

函数的参数必须是固定类型,效率低,不易出错

宏可以实现函数不能实现的功能


原创粉丝点击