【提问】C库函数调用与参数宏的区别!
以求最大值为例!!!(1)使用库函数:
#include <stdlib.h>
main()
{
int a,b,t;
scanf("%d%d",&a,&b);
t=max(a,b);
printf("This is %d.\n",t);
getch();
}
(2)使用宏定义:
#define max(a,b) (a)>(b)?(a):(b)
main()
{
int a,b,t;
scanf("%d%d",&a,&b);
t=max(a,b);
printf("This is %d.\n",t);
getch();
}
请指点下:
一、
不知,(1)中在预编译后,是把库函数中的所以内容都被包括进来,还是只包括了,max()函数?
二、
我看了它的库函数,其中对max()的定义是这样的:
#define max(a,b) (((a) > (b)) ? (a) : (b))
(不知我这么说对不对?)按这样的话,在预编译后,那不就和例(2)的一样了吗?这不就,使得函数和预编译没区别了吗???又何来的函数调用???倒完全成了一个预处理了!!!
小弟对此处不是很明白,望大家指点一二!不胜感激!!!先谢过!!!
----------------解决方案--------------------------------------------------------
一、全部包含;
二、结果一样,流程不同;
----------------解决方案--------------------------------------------------------
哦,谢谢!!!
我再看看!
----------------解决方案--------------------------------------------------------
#include "max.c"
main()
{
int a,b,t;
scanf("%d%d",&a,&b);
t=max(a,b);
printf("This is %d.\n",t);
getch();
}
若我自己也写个max.c文件,上面这个程序,也是个函数调用吧???那么在预处理后,是否就成为如下:
(和发表中的(2)一样吧!)
#define max(a,b) (a)>(b)?(a):(b)
main()
{
int a,b,t;
scanf("%d%d",&a,&b);
t=max(a,b);
printf("This is %d.\n",t);
getch();
}
而(2)在预编译后,其中的max(a,b)则会被替代!
----------------解决方案--------------------------------------------------------
回复:(丁月文)C库函数调用与预处理的区别!...
楼主提的问题很好,可惜举的例不恰当。在stdlib中max(a,b)不是函数而是带参数的宏。
你的困惑很可能就是将它误作函数导致的。
顺便指出:stdio中的getchar()也是参数宏
----------------解决方案--------------------------------------------------------
呵,是这样,你说对了,
我以为只要在库函数中的就是函数调用!!!
那就是说,我的第一个例子,实际上是个间接的宏定义了!!!!
呵,我问题清楚了,谢谢!!!
而这样,这两个相比,最好的,还是第二个例子了,那样,代码也小,对吧?
直接宏定义,不用包含那个库函数反好些了。
----------------解决方案--------------------------------------------------------
版主说得极对,
至于函数和宏定义自然是有区别的,宏定义在预处理时就被编译器替代过来,而函数则是由编译器给程序指出函数入口地址,再进入执行,相比较而言,宏调用较好,少了调用函数的时间。
这其实就像C++里面的函数有没有加line一样.
----------------解决方案--------------------------------------------------------
谢了,把我的问题解决了,呵呵
一开始当然知道函数调用与宏的不同,
只是我后来看了库函数,才发现有那些宏定义,
想到宏定义,一比较,就想不通了,
原来,我一直以为用include调用库函数了,那就是函数调用!晕,这么简单的问题,这样说出来,我反明白了,呵呵!
谢过大家了!!!很简单的,让我给搞复杂了!
----------------解决方案--------------------------------------------------------