c语言宏与函数定义的区别 c语言中什么叫宏定义

请问C语言中带参数的宏和函数的比较宏是用于编译器处理的,他在程序编译时,会在对应位置展开成代码 。。,这就相当于你在告诉编译器,我想在这个位置加一些代码,代码的内容已在宏中定义,请编译器自己支找 。。。,也就是说程序在运行时 , 早已变成了对应位置上的代码,此时已没有宏的概念了 。。。。
而函数则是运行时,调用 。他不会在编译时,在对应位置上加上函数代码,只是加上一个函数入口指针 。。。从这个入口去运行一段代码 。。。运行完了之后回到当前位置继续执行 。。。。
可以简单的认为,宏是在编译时上起作用,而函数是运行时起作用 。。。
C语言中宏函数跟自定义的函数有什么区别?可以把宏理解成拼字游戏,它功能很强大 , 但是强大到使用不好就会有副作用 。C有很多语言设施用来完全特定功能c语言宏与函数定义的区别的宏,如const,inline,template,就是为了让大家少用宏 。给c语言宏与函数定义的区别你举个宏和函数不同的例子代码c语言宏与函数定义的区别:
#define max(x,y) ((x)(y)?(x):(y))
template class T
inline T max(T x,T y){return xy?x:y;}
看起来似乎是相同的功能 , 可是函数调用,毕竟会求完每一个实参的值,再传递给被调函数,即使声明了inline , 在调用点展开而不发生实际的调用开销 。
但是你试试用这个调用宏,结果就会有问题:
int i=4,j=5;
int k=max(i,j);
如果是函数调用,i==5,j==6,k==5 。如果是宏的话,结果是:
int k=((i)(j)?(i):(j));
你觉得会一样吗c语言宏与函数定义的区别?所以,慎用宏 。
MFC中有很多功能是宏完成的 , 它太强大了,很多情况下有宏很高效,但是不容易控制 。
C语言中带参数的宏定义与函数的区别(试举例)宏只是字符的替换,在预处理阶段就给替换到代码中去了比如下面的代码
#include
#define
MAX(x,
y)
((x)(y)?(x):y())
int
main()
{
int
a
=
2,
b
=
4;
int
m;
m
=
MAX(2,
4);
printf("%d\n",
m);
return
0;
}
如果你用的是gcc编译器,执行
gcc
-E
main.c
-o
main.i , 打开main.i文件就可以看到他是如何替换进去的,直接拖到最后,前面的都是stdio.h中的内容 。
int
main()
{
int
a
=
2,
b
=
4;
int
m;
m
=
((2)(4)?(2):4());
printf("%d\n",
m);
return
0;
}
函数就不同了,函数还需要分配栈空间,在执行函数时都要进行入栈和出栈操作 , 有的还需要分配堆空间 。
宏所实现的功能有限,而且长代码不易读,但是对于逻辑简单、代码不长、经常使用的功能由宏来实现是个不错的选择
我想知道c语言里面怎么区分函数与宏在C及C语言中允许用一个标识符来表示一个字符串 , 称为宏,该字符串可以是常数、表达式、格式串等 。在编译预处理时,对程序中所有出现的“宏名” , 都用宏定义中的字符串去代换 , 这称为“宏代换”或“宏展开” 。宏定义是由源程序中的宏定义命令完成的 。宏代换是由预处理程序自动完成的 。若字符串是表达式,我们称之为函数式宏定义,那函数式宏定义与普通函数有什么区别呢?我们以下面两行代码为例 , 展开描述:
函数式宏定义:#define MAX(a,b) ((a)(b)?(a):(b))
普通函数: MAX(a,b) { return ab?a:b;}
(1)函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心 。
(2)调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同 。
如果MAX是个普通函数,那么它的函数体return ab ? a : b; 要编译生成指令,代码中出现的每次调用也要编译生成传参指令和call指令 。而如果MAX是个函数式宏定义,这个宏定义本身倒不必编译生成指令,但是代码中出现的每次调用编译生成的指令都相当于一个函数体,而不是简单的几条传参指令和call指令 。所以,使用函数式宏定义编译生成的目标文件会比较大 。
(3)函数式宏定义要注意格式,尤其是括号 。
如果上面的函数式宏定义写成 #define MAX(a, b) (ab?a:b),省去内层括号,则宏展开就成了k = (i0x0fj0x0f?i0x0f:j0x0f),运算的优先级就错了 。同样道理,这个宏定义的外层括号也是不能省的 。若函数中是宏替换为MAX(a,b),则宏展开就成了(a)(b)?(a):(b),运算优先级也是错了 。
(4)若函数参数为表达式,则普通函数的调用与函数式宏定义的替换过程是不一样的 。
普通函数调用时先求实参表达式的值再传给形参,如果实参表达式有Side Effect,那么这些SideEffect只发生一次 。例如MAX(a,b),如果MAX是普通函数,a和b只增加一次 。但如果MAX函数式宏定义,则要展开成k = ((a)(b)?(a):(b)) , a和b就不一定是增加一次还是两次了 。所以若参数是表达式,替换函数式宏定义时一定要仔细看好 。
(5)函数式宏定义往往会导致较低的代码执行效率 。
看下面一段代码:
int a[]={9,3,5,2,1,0,8,7,6,4};
int max(n)
{
return n==0?a[0]:MAX(a[n],max(n-1));
}
int main()
{
max(9);
return 0;
}
若是普通函数,则通过递归,可取的最大值 , 时间复杂度为O(n) 。但若是函数式宏定义,则宏展开为( a[n]max(n-1)?a[n]:max(n-1) ),其中max(n-1)被调用了两遍,这样依此递归下去,时间复杂度会很高 。
尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率 , 毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数式宏定义来代替实现 。
c语言 , 宏定义,与函数的差别 我觉得宏定义和函数没什么差别啊 , 是否可以用宏定义代替函数不同 。
虽然功能近似c语言宏与函数定义的区别,但函数会产生独立代码c语言宏与函数定义的区别,每次调用执行c语言宏与函数定义的区别的是同一个位置的代码 , 无论调用多少次 。
宏定义是简单的文本替换,产生的代码是替换后程序产生的代码,简单说就是程序里每次使用宏替换后的地方都要产生类似的代码 , 而这些替换后产生的代码存在于程序的不同位置 。
宏定义不检查参数类型,仅仅是简单的文本替换
c语言宏定义和函数的区别不管是宏定义还是函数,都不要在修改某个变量之后,在同一个表达式中的另一个地方读取这个变量的值 。否则结果就是未定义的
对于你的代码,在下面的表达式中
printf("%d^2 = %d\n", (i-1), SQ(i))
//12
标有 2 的地方修改了变量 i 的值,标有 1 的地方又尝试读取 i 的值 。你可能以为 1 在 2 之前计算 。然而——你以为你以为的就是你以为的?
【c语言宏与函数定义的区别 c语言中什么叫宏定义】c语言宏与函数定义的区别的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言中什么叫宏定义、c语言宏与函数定义的区别的信息别忘了在本站进行查找喔 。

    推荐阅读