typedef与define的区别

来源:互联网 发布:聚游网络dnf登陆器 编辑:程序博客网 时间:2024/05/01 22:23



转载自:http://blog.csdn.net/tianshuai11/article/details/7036136


    一,定义

           typedef:声明自定义数据类型,配合各种原有数据类型,用来简化编程。

    二,用途

            1,便于移植

                  typedef  int  INT32;

                  INT32     a;//定义整型变量

                  (INT32)   a;//强制转换类型

 

                  为什么有int 还要取同名 INT32 ?

                  答:A微处理器 int 16位,long  32位

                          B微处理器 short 16位,int 32位,long  64位

                         原本A处理器下程序:

                                     typedef  int      INT16;

                                     typedef  long   INT32;

                          要移植到B处理器下,则仅仅需要更改这些新名称就行,而不用更改整个程序。

                                     typedef  short       INT16;

                                     typedef  int            INT32;

             2,在旧的C代码中,帮助struct。

                    由于在旧的C代码中,声明struct对象时,必须带上struct 。

                    如:struct  node

                           {

                                int  data;

                                struct  node  next;  //C语言中必须带上 struct ;而在C++中则可以省略struct

                           } ;

                    而写成

                            typedef   struct  node

                          {

                                 int   data; 

                           }node_re;

                           node_re     root;

            3,定义已有类型的一种别名

                      typedef      char     *pchar;

                      pchar   pa,pb;

                      为指针声明typedef 时,容易出现问题。所以建议:只要为指针声明 typedef,那么都要在最终的 typedef 名称中加一个 const,以使得该指针本身所指对象不会通过指针被修改。

                       typedef   const  char   *pchar;

          

define

    一,定义:定义宏,即允许用一个标示符来表示一个字串。

    二,用处:

                   1,方便程序修改

                         定义程序中经常使用的常量,这样在常量改变时,不用对整个程序进行修改。

                         例如:#define  pi   3.141592653  //不用每次都输入3.141592653 直接输入 pi

 

                   2,提高程序运行效率

                          C语言中,函数的使用可以使程序更加模块化,便于组织,而且可以重复利用。

                          但是,函数调用时,需要保留调用函数的现场,便于子函数执行结束后能返回继续执行。在子函数执行完后要恢复调用函数的现场,这需要一定时间。

                          如果子函数执行操作较多,这种转换时间可以忽略。但是如果执行功能较少,则开销相对较大。

                          例如:#define S(a,b)   a*b   //仅仅是一条乘法 操作

define与typedef的区别

        typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量,到了C++,const、enum、inline的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与typedef两者到底该用哪个好,如#define INT int这样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedef,因为在早期的许多C编译器中这条语句是非法的,只是现今的编译器又做了扩充。为了尽可能地兼容,一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗长的类型的别名。

       宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。请看上面第一大点代码的第三行:

    typedef   (int*)    pINT;
    

    #define    pINT2   int*

效果相同?实则不同!实践中见差别:

            pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。

            而pINT2 a,b;的效果同int *a, b;表示定义了一个整型指针,一个整型变量



typedef 函数指针的用法


在网上搜索函数指针,看到一个例子。开始没看懂,想放弃,可是转念一想,这个用法迟早要弄懂的,现在多花点时间看懂它,好过以后碰到了要再花一倍时间来弄懂它。其实很多时候都是这样,如果每次到难一点的内容,总想着下次我再来解决它,那就永远也学不到东西。

后面那个例子加了注释,是我对这种用法的理解,希望对新手有所帮助。

进入正文:

 代码简化, 促进跨平台开发的目的.

 typedef 行为有点像 #define 宏,用其实际类型替代同义字。

 不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换

用法一:

typedef int (*MYFUN)(int, int)
这种用法一般用在给函数定义别名的时候
上面的例子定义MYFUN 是一个函数指针, 函数类型是带两个int 参数, 返回一个int 

分析这种形式的定义的时候可以用下面的方法: 
先去掉typedef 和别名剩下的就是原变量的类型. 
去掉typedef和MYFUN以后就剩:
 
int (*)(int, int)

用法二:

typedef给变量类型定义一个别名.

typedef struct{ 
int a; 
int b; 
}MY_TYPE

这里把一个未命名结构直接取了一个叫MY_TYPE的别名, 这样如果你想定义结构的实例的时候就可以这样: 
MY_TYPE tmp;

第二种用法:typedef 原变量类型 别名

简单的函数指针的用法

//形式1:返回类型(*函数名)(参数表)

char(*pFun)(int);

//typedef char(*pFun)(int)   //跟上一行功能等同

/*typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。*/

char glFun(int a){return;}

void main()

{

pFun =glFun;

(*pFun)(2);

}

第一行定义了一个指针变量pFun.它是一个指向某种函数的指针,这种函数参数是一个int类型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值

第二行定义了一个函数glFun().该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数-函数的函数名实际上就是一个指针函数名指向该函数的代码在内存中的首地址

下面是一个例子:

C代码 复制代码
  1. //#include<iostream.h>   
  2. #include<stdio.h>   
  3.   
  4. typedef int (*FP_CALC)(intint);   
  5. //注意这里不是函数声明而是函数定义,它是一个地址,你可以直接输出add看看   
  6. int add(int a, int b)   
  7. {   
  8.      return a + b;   
  9. }   
  10. int sub(int a, int b)   
  11. {   
  12.      return a - b;   
  13. }   
  14. int mul(int a, int b)   
  15. {   
  16.      return a * b;   
  17. }   
  18. int div(int a, int b)   
  19. {   
  20.      return b? a/b : -1;   
  21. }   
  22. //定义一个函数,参数为op,返回一个指针。该指针类型为 拥有两个int参数、   
  23. //返回类型为int 的函数指针。它的作用是根据操作符返回相应函数的地址   
  24. FP_CALC calc_func(char op)   
  25. {   
  26.      switch (op)   
  27.       {   
  28.      case '+'return add;//返回函数的地址   
  29.      case '-'return sub;   
  30.      case '*'return mul;   
  31.      case '/'return div;   
  32.      default:   
  33.          return NULL;   
  34.       }   
  35.      return NULL;   
  36. }   
  37. //s_calc_func为函数,它的参数是 op,   
  38. //返回值为一个拥有 两个int参数、返回类型为int 的函数指针   
  39. int (*s_calc_func(char op)) (intint)   
  40. {   
  41.      return calc_func(op);   
  42. }   
  43. //最终用户直接调用的函数,该函数接收两个int整数,和一个算术运算符,返回两数的运算结果   
  44. int calc(int a, int b, char op)   
  45. {   
  46.       FP_CALC fp = calc_func(op); //根据预算符得到各种运算的函数的地址   
  47.          int (*s_fp)(intint) = s_calc_func(op);//用于测试   
  48.          // ASSERT(fp == s_fp);    // 可以断言这俩是相等的   
  49.      if (fp) return fp(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果   
  50.      else return -1;   
  51. }   
  52.   
  53. void main()   
  54. {      
  55.     int a = 100, b = 20;   
  56.   
  57.       printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));   
  58.       printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));   
  59.       printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));   
  60.       printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));   
  61. }  
//#include<iostream.h>#include<stdio.h>typedef int (*FP_CALC)(int, int);//注意这里不是函数声明而是函数定义,它是一个地址,你可以直接输出add看看int add(int a, int b){return a + b;}int sub(int a, int b){return a - b;}int mul(int a, int b){return a * b;}int div(int a, int b){return b? a/b : -1;}//定义一个函数,参数为op,返回一个指针。该指针类型为 拥有两个int参数、//返回类型为int 的函数指针。它的作用是根据操作符返回相应函数的地址FP_CALC calc_func(char op){switch (op){case '+': return add;//返回函数的地址case '-': return sub;case '*': return mul;case '/': return div;default:return NULL;}return NULL;}//s_calc_func为函数,它的参数是 op,//返回值为一个拥有 两个int参数、返回类型为int 的函数指针int (*s_calc_func(char op)) (int, int){return calc_func(op);}//最终用户直接调用的函数,该函数接收两个int整数,和一个算术运算符,返回两数的运算结果int calc(int a, int b, char op){FP_CALC fp = calc_func(op); //根据预算符得到各种运算的函数的地址int (*s_fp)(int, int) = s_calc_func(op);//用于测试// ASSERT(fp == s_fp);   // 可以断言这俩是相等的if (fp) return fp(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果else return -1;}void main(){int a = 100, b = 20;printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));}

运行结果

   calc(100, 20, +) = 120

   calc(100, 20, -) = 80

   calc(100, 20, *) = 2000

   calc(100, 20, /) = 5



原创粉丝点击