#define和typedef

在C/C++中,经常被问到#define和typedef的区别,
我想,最大的区别是:
#define为预处理指令,用它来定义常量(包括无参量与带参量),在编译的预处理阶段进行简单的替换
typedef常用来定义一个已知类型、标识符或关键字的别名,在编译时如同定义变量的方法那样来声明一种类型。
下面列举了一些具体的异同:

#include <iostream.h>


//定义宏开关,也可在编译时加参数-D, g++ -D def.cpp
#define DEBUG


//定义常量
#define PI 3.1415abc
#define CONSTANT 1  


//定义类型
#define U8 unsigned char 
typedef char INT8; 
typedef static int staticINT;		
typedef int *A[5]; //数组指针
typedef int *(*Func[5])(void(*)()); //函数数组指针
typedef struct S_TYPEDEF //结构体
{
  int temp;
}S;
//在C语言里面,如果不用typedef struct, 在声明时必须struct S_TYPEDEF st;而C++就不存在,直接S_TYPEDEF st;

//定义方法,可带参
#define TEST(x) \
        for(int i= 0; i<x; i++) \
		cout<<i<<endl;

		
		
//区别:

//1.用#define定义的指针类型 定义多个连续变量,从第二个开始将抛弃指针
#define STR_DEF char* 
typedef char* STR_TYP;
//这里将编译出错,str_d2的类型是char,而不是char*
STR_DEF str_d1 = "abc";// str_d2 = "xyz";
STR_TYP str_t1 = "abc", str_t2 = "xyz";


//2.typedef定义的指针类型,把const加在类型前面(加在后面正常), 看似常量指针,实际指针常量
void mystr() 
{
  typedef char* PSTR; 
  //看似是cont char*PSTR,实际上是char* const(指针常量,指针不可变,常量可变)
  const PSTR pstr = "abc";
  //pstr = "xyz";//编译报错
  *pstr = 'a';  
  
  //定义为const char *p(常量指针)
  const char *p = "abc";
  p = "xyz";
  //*p = 'a';//编译报错
  
  #define STR char*  //类型不会发生变化
  const STR str = "abc";
  str = "xyz";
  //*str = 'a'; //编译报错 

} 


//3.#define的没有作用域的限制,在局部定义,其它外部也可以使用
//typedef有作用域的限制,局部定义,局部使用
void test_define()
{
  #define LOCAL
  typedef int Array[10];
}

void test_define_cout()
{
  #ifdef LOCAL
  //可以输出
  cout<<"hello local define"<<endl;
  #endif
  //编译报错,Array没有定义
  //Array a, b ; //a[10], b[10]
}


int main()
{  
  TEST(10);
  test_define_cout();
  mystr(); 
  return 1;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值