C语言里面有两个不容易区分的语法概念,宏定义define 和类型重命名typedef。下面我们来谈一下两者之间的差异。
1.类型重命名typedef:
关键字typedef提供了一种为已定义好的数据类型创建别名的机制,为了创建更简短的类型名,通常使用typeddef来为结构体起名字,这样就不需要结构体标记了。使用typedef可以提高程序的可移植性,可读性和可维护性。
2.预处理命令:宏 #define
宏是预处理命令的一种标识符。与符号常量一样程序中的许多宏标识符也要在程序被编译之前用其对应的替换文本来替换,宏的定义可以带参数,也可以不带。
#include<stdio.h>
#include<typeinfo>
using namespace std; //C++
#define int int * //注意不能误加分号
void main()
{
int a,b; //预编译:int *a,b; 【*和变量名结合,不和类型名结合。】 a为指针,b为整型。
#undef int //取消宏替换。
int p;
int s;
}
也许你会想,上面代码用关键字做宏替换是怎么编译通过的? 那是因为为宏展开是在预编译阶段进行替换,已经替换了,编译阶段才进行类型检查,所以不要紧。
#include<stdio.h>#define MAX(a,b)((a)>(b)?(a):(b))
int Max(int a,int b){return a>b?a:b;}
//那么,分别用宏展开和函数调用,实现找出两数中较大值。二者区别在哪?
//一个是替换 一个是函数调用
void main()
{
int x=10,y=10;
MAX(++x,y); //((++x)>(y)?(++x):(y))
printf("%d\n",x);
}
宏具有副作用 使用宏,主函数中x=12。而调用函数,x=11; 宏在预编译阶段替换,不做类型检查,具有某种程度上的泛型; 宏的运行速度比函数的速度要快。 函数调用进行现场的保护和恢复。
而typedef实在编译阶段进行替换的,在进行编译的时候,首先进行宏替换,将所有的宏的关键字的地方都替换成宏定义的字符。