• typedef和define的详细区别


    对于都可以用来给对象取一个别名的Typedef和define来说,是有区别的。本文通过对typedef和define的介绍,来给读者详细的讲解它们存在的本质区别,供参考。

    AD:

    typedef是一种在计算机编程语言中用来声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字。 #define是预处理指令。下面让我们一起来看。

    typedef是C语言语句,其功能是用户为已有数据类型取“别名”。 

    例如: 

    1. typedef int INTEGER;  

    这以后就可用INTEGER来代替int作整型变量的类型说明了,如:  

    1. INTEGER a,b;   

    用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单而且使意义更为明确,因而增强了可读性。例如: 

    1. typedef int a[10];//表示a是整型数组类型,数组长度为10。 

    然后就可用a说明变量,如:

    1. a s1,s2;//完全等效于:int s1[10],s2[10] ; 

    同理 typedef void (*p)(void) 表示p是一种指向void型的指针类型!

    #define是预处理中的宏定义命令,例如:

    1. #define int PARA  

    表示在源程序中的所在int将会被PARA原样代替! 

    如:程序中有int a,b ;则在编译前将被替换为PAPA a,b;

    #define是C中定义的语法,typedef是C++中定义的语法,二者在C++中可以通用,但#define成了预编译指令,typedef当成语句处理。Typedef和define都可以用来给对象取一个别名,但是两者却有着很大不同。

    1. 首先,二者执行时间不同

    关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。

    Define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。

    #define用法例子: 

    1. #define f(x) x*x  
    2. main( )  
    3. {  
    4. int a=6,b=2,c;  
    5. c=f(a) / f(b);  
    6. printf("%d \n",c);  

    程序的输出结果是: 36,根本原因就在于#define只是简单的字符串替换,应当加个括号“(X*X)”。

    2. 功能不同

    Typedef用来定义类型的别名,这些类型不只包含内部类型(int,char等),还包括自定义类型(如struct),可以起到使类型易于记忆的功能。 

    如:

    1. typedef int (*PF) (const char *, const char *); 

    定义一个指向函数的指针的数据类型PF,其中函数返回值为int,参数为const char *。

    typedef 有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以i获得最高的精度:

    1. typedef long double REAL; 

    在不支持 long double 的机器上,该 typedef 看起来会是下面这样:

    1. typedef double REAL; 
     

    并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样:

    1. typedef float REAL; 

    #define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

    3. 作用域不同

    #define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而typedef有自己的作用域。

    1. void fun()   
    2. {   
    3. #define A int   
    4. }  
    5. void gun()   
    6. {   
    7. //在这里也可以使用A,因为宏替换没有作用域,   
    8. //但如果上面用的是typedef,那这里就不能用A ,不过一般不在函数内使用typedef  

    4. 对指针的操作

    二者修饰指针类型时,作用不同。

    1. Typedef int * pint;  
    2. #define PINT int *  
    3. Const pint p;//p不可更改,p指向的内容可以更改,相当于 int * const p;  
    4. Const PINT p;//p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p;  
    5. pint s1, s2; //s1和s2都是int型指针  
    6. PINT s3, s4; //相当于int * s3,s4;只有一个是指针。 

    其实,typedef和define末尾的标号也是不一样的,希望大家不要忽略这一点。通过本文的分析,相信你已经了解了这两者之间的区别。掌握了区别之后,运用起来会更加的灵活。

  • 相关阅读:
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    PHP extract() 函数
    PHP end() 函数
    PHP each() 函数
    PHP current() 函数
  • 原文地址:https://www.cnblogs.com/dartagnan/p/2816454.html
Copyright © 2020-2023  润新知