#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;


//定义方法,可带参
#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;
}


 

你可能感兴趣的:(#define和typedef)