当前位置:文档之家› 比较C语言中带参数的宏

比较C语言中带参数的宏

不是函数调用,其在系统编译前就被处理成: y=((-2)>0?(-2):-(-2)); 在宏定义中,形参通常需要用括号括起来避免出错,而且应该在 整个字符串外加上括号。 在进行宏定义时,在宏名与带参数的括号之间不应该加空格;否 则将空格以后的内容作为替代字符串的一部分,即系统将其看作 不带参数的宏定义。
谢谢观看!
窗棂趣分享
例:#define ABS(x) ((x)>0?(x):-(x))
#define ABS (x) ((x)>0?(x):-(x))
与C++中的内联函数、函数模板比较
C++内联函数在程序运行的时候在调用点“就地展开”,而C 语言中的带参数的宏是在编译前“就地展开”。由于两者都 没有像函数调用那样需要入栈和出栈,所以程序运行速度加 快,但是在多次使用后,代码都会占用大量的空间。
比较C语言中带参数的宏与C++中内联函数 和函数模板及一些注意事项
以奇渠
C语言中带参数的宏
1.带参数的宏定义指令
#define 宏名(参数表) 字符串 例:#define ABS(x) ((x)>0?(x):-(x))
这里x是参数,三目运算符表达式为计算参数的绝对值。这里的 ABS(x)既不是函数定义,也不是语句(此处无分号)。y=ABS(-2);
宏不存在类型问题,宏名无类型,它的参数也无类型,只是 一个符号代表,展开时代入指定的字符串即可。宏定义时, 字符串可以是任意类型的数据。而内联函数需要的实参和形 参都要定义类型,而且两者的类型应相同。

函数模板格式: Template <typename 形式数据类型表> 返回类型 函数模板名
例:template <typename T> T Max(T a,T b)
{ return (a>b)?a:b;
}
与带参数的宏类似的是,函数模板也支持不同数据类型的参 数。但是对于每一个模板函数来说,每一个都有各自唯一确 定的数据类型。 函数模板使用时数据类型便会确定而变成模板函数。便像普 通函数一样需要函数调用,进栈出栈的过程。 宏替换不占用运行时间,只占用编译时间。而模板函数调用 则占用运行时间(分配单元,保留现场,值传递,返回)。
相关主题