宏定义(#define)、内联函数、typedef的区别

首先,说说三个名词的基本概念:
1、宏定义:一种简单的发生在编译之前的文本插入替换
语法: #define p_char char*
注意!不需要分号标识结束

2、typedef:发生在编译期间,用于定义类型别名
语法:typedef char* p_char;
注意!需要分号标识结束

typedef可以用于各种数据结构的别名定义,但是宏定义比起typedef更容易引起危险。详见以下示例:

#include<iostream>
#define a_char char* 
typedef char* b_char;
int main()
{
	a_char p1,p2;  //p1是个char指针,p2是个char变量
	b_char p3,p4; //p3,p4都是char指针
	return 0;
}

3、内联函数(inline)发生在编译期间
用法:inline用在定义函数时使用

inline  ret_val A
{
	...
	return ...;
}

以上代码发生在程序员想告诉编译器:我定义了返回值为ret_val的函数A!调用函数的时候不要调用它!而是插入函数体的返回值!
具体例子如下(代码转载自https://blog.csdn.net/cpongo3/article/details/93996094):

inline char* dbtest(int a) 
{  
    return (i % 2 > 0) ? "奇" : "偶";  
}   
 
int main()  
{  
    int i = 0;  
    for (i=1; i < 100; i++) 
    {  
        printf("i:%d    奇偶性:%s /n", i, dbtest(i));      
    }  
}

上面的例子就是标准的内联函数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的内部任何调用dbtest(i)的地方都换成了(i%2>0)?“奇”:"偶"这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。

内联函数与define都执行了替换,那么性能如何变化呢?
内联函数减少了函数调用,但是增加了代码编译量。
显然,很长的代码不适合内联(PS,内联中不能自己递归自己),因为多出的编译成本远大于函数调用成本的减少量。短代码适合内联!

发布了5 篇原创文章 · 获赞 0 · 访问量 169

猜你喜欢

转载自blog.csdn.net/jojozym/article/details/104617847
今日推荐