【C语言】宏定义define 和类型重命名typedef

  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实在编译阶段进行替换的,在进行编译的时候,首先进行宏替换,将所有的宏的关键字的地方都替换成宏定义的字符。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值