宏函数详解

宏函数详解本文详细介绍了 C 语言中的宏定义 包括宏常量 宏语句和宏函数的使用 以及预处理器的特殊操作如字符串化 和片段连接符

大家好,欢迎来到IT知识分享网。

①宏函数:STL模板、实现函数的复用性

函数:可以传递参数、但是不能将类型作为参数传递

例如:

一个开辟内存的函数:

#define Malloc(type,size)  (type*)malloc( sizeof(type) * size )

int *p = Malloc(int,100);

char *q = Malloc(char,100);

②传递数组

        函数参数传递只能传首地址,无大小,失去数组特性,所以排序等操作需要在函数里面进行遍历

        宏函数可以传递首地址和大小,例如插入排序 sort(int *a,int size),这是在宏函数里面进行排序遍历

        虽然这两者实现方法不同,但是好像并没有什么区别,都需要遍历,时空消耗差不多

③字符串化“#”

#define Print(str){

        printf(#str”的值是%d”,str);

}

main(){

        Print(3+4);       

}

④片段连接符“”:分割连接方式,先分割,再强制连接

#define Add(n,value)\

{\

        //num1  +=  value;\

        numn += value;\

}

main(){

        int num1=1,num2=10;

        Add(2,10);

        printf(“num1=%d\n num2=%d”,num1,num2);

}

        个人感觉这个片段连接符很鸡肋,但是如果要通用,效果还是不错的。

在普通的宏定义中,预处理器一般把空格解释成分段标志,对于每一段和前面比较,相同的就被替换。但是这样做的结果是,被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些来替代空格。

 宏用法:

宏常量: #define STR “圆周率等于”

             #define PI 3.14   

             printf(“%s %f”,STR,PI); //main中

宏语句:#define Print printf(“Hello world!”);

               Print; //main中

宏函数:#define Print(str)  printf(“%s”,str);

            int main(){        printf(“这是一个只有一条语句的宏函数”);        }

撤销宏定义:#define PI 3.

                   #undef PI

宏相关作用符:末尾需要加上\

例如:有参宏函数

#define Show(str1,str2,str3)\

{\

        printf(“%s\n”,str1);\

        printf(“%s\n”,str2);\

        printf(“%s\n”,str3);\

}

main中引用:show(“first”,”second”,”third”);

注意事项:

①由于宏都是在预处理阶段进行原样替换,所以要注意运算符优先级问题

②宏参数重复调用

#define MAX(a,b) ((a)>(b)?(a):(b)) int a=0; int b =1; int c =MAX(++a,++b); //等价于 int c =((++a)>(++b)?(++a):(++b)); 

③分号吞噬问题

if(num>0)

        FUN(num);

else

        …

//等价于

if(num>0){FUN(num)};

else …//导致else缺少if的错误, ‘else’ without a previous ‘if’

#include"stdio.h" #define FUN(n)\ {\ while(n>0)\ {\ if(n==3)\ break;\ }\ } int main() { int num=10; if(num>0) FUN(num); else num=-num; return 0; } 

④递归调用问题,编译器默认调用1次

#define  num  num+4

⑤宏参数预处理

#define A(y) X_y #define B(y) A(y) #define SIZE 1024 #define S SIZE 

宏优点:代码复用率高;提高性能

宏缺点:不可调试;无安全类型检查;可读性差,容易出错

 转至博客 鸣鼓ming  大大C语言_宏定义_鸣鼓ming的博客-CSDN博客_c 宏定义详情请点击链接

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/122977.html

(0)
上一篇 2025-10-12 16:33
下一篇 2025-10-12 17:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信