#define和typedef

来源:互联网 发布:wifi监控器软件下载 编辑:程序博客网 时间:2024/05/20 03:06

在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 0
原创粉丝点击