在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;
}