
在C程序中,可以使用宏定义函数代替简单的函数,从而提高了程序的效率. 预处理器通过复制宏代码来替换函数调用,从而消除了参数堆栈,使用汇编语言生成CALL调用以及返回参数,执行返回和其他过程的需求,从而提高了速度. 缺点是使用宏代码的最大缺点是容易出错. 预处理程序在复制宏代码时通常会产生意外的边际效应.
//宏定义函数
#define TEST(a) a*3
int main()
{
int a = 2;
int tmp = TEST(a+2);
printf("tmp = %d\n",tmp);
}
结果
tmp = 8
结果不应该为12,这是因为宏定义函数不会处理表达式以查找a + 2的值,而是直接扩展宏定义TEST(a + 2)=》 a + 2 * 3不做任何处理,因此结果为8,要解决此问题,在定义宏时需要添加括号

#define TEST(a) (a)*3
代码扩展变为(a + 2)* 3,结果正确. 因此,请记住在宏定义参数中添加括号.
#define MAX(a,b) (a)>(b)?(a):(b)
int main()
{
int a = 2;
int b = 3;
int max = ++MAX(a,b);
printf("max = %d\n",max);
}
结果
max = 3

结果又是错误的,首先扩展宏定义以查看,
++ MAX(a,b)=> ++(a)>(b)?(a):( b)目前,()具有更高的优先级,请先放在括号中,然后转到+ +,所以a的值为3,结果为3. 解决方案: 尝试返回包含另一层括号的结果
#define MAX(a,b) ((a)>(b)?(a):(b))
(用c语言)编译错误,三目运算符的返回值不能用作左值. 因此,将不会以这种方式使用常规宏定义功能. 宏定义函数返回一个常量,该常量不能用作左值.
#define MAX(a,b) (a)>(b)?(a):(b)
int main()
{
int a = 2;
int b = 3;
int max = MAX(a,++b);
printf("max = %d\n",max);
}

结果
max = 5
结果是5,为什么?展开宏定义以查看:
MAX(a,++ b)=>(a)>(++ b)?(a): (++ b)结果可以理解,b递增两次,则宏定义函数将不会已处理传入的值将仅通过宏定义扩展,因此在扩展前b不会增加到4. 有解决方案吗?不是.
使用宏定义函数时,请尝试将参数括在括号中,以便首先计算参数的表达式,然后运行宏定义函数的内容. 另外,请尽量不要使用递增和递减运算符,结果可能无法预测. 宏定义函数返回一个常量,不能用作左值.

在计算机科学中,内联函数(有时称为联机功能或编译时扩展功能)是一种编程语言结构,用于建议编译器对某些特殊功能进行内联扩展(有时称为联机扩展). 这也具有与宏定义功能相同的优点. 推栈没有开销,而弹出栈的开销会提高效率.
//定义内联函数
inline void test()
{
printf("test\n");
}
要定义内联函数,只需在函数定义之前添加“ inline”关键字. 请注意,声明函数中添加的关键字未定义为内联函数. 定义时必须添加它. 内联函数会在运行时直接扩展函数主体宏定义 内联函数,因此在某些情况下最好不要使用内联函数:
1. 有一个循环体
2. 功能体比较大
3. 递归函数
简而言之,需要在函数体内打开大量内存的函数不适合定义为内联函数宏定义 内联函数,因为它将消耗大量内存并花费很长时间.
宏定义函数的扩展处于预编译阶段,内联函数处于编译阶段. 宏定义的函数将不检查语法错误,而内联函数将进行语法错误检查. 宏定义与参数数据类型无关,但与内联函数无关.
微信
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-236219-1.html
我不觉得自己多勇敢