typedef和define的区别

原创 2012年03月29日 14:57:56

C程序员面试的时候会经常的遇到typedefdefine区别的问题,当然,可能大部分只是考察define的用法,考察的关键点之一是:define是宏定义,发生在与处理阶段,也就是编译之前,只进行简单而机械的字符串替换,而不进行任何检查。

而在有些面试中,这两个会结合起来一起考察,我们就应该掌握比较基础的,而遇到类似于int *(*func[5])(int (*)())甚至更复杂+BT的考试的时候,大可以跟面试官说:别这么孔乙己好不好,我们应该看中编程的可读性。当然,前提是咱们有更好的工作等着咱们。废话不多说,开始大致讲解一下两者之间的区别。

首先,运行时间不一样。typedef在编译阶段有效,因此它会有类型检查的功能,而define在编译之前进行机械的字符串替换,没有任何检查。例如:

#define f(x) x*x
main()
{
    int a = 6, b = 2, c;
    c = f(a)/b(2);
}

 

这时候c的值时36。因为简单替换字符串之后是c = 6*6 / 2*2;很明显,应该是36。当然,大部分程序会这样定义

#define f(x) ((x)*(x))

 

这样,如上程序,c值才会是可能程序员想要的9。可是,如果哪个BT非如下调用肿么办?

c = f(a++) / f(b++);

 

我说了,不要影响程序的可读性,这种调用我也不知道正确的解释是什么,可能和编译器有关系,但我保证我不这样用。

其次,功能不同。~~功能~~,嘿嘿。

typedef用来定义类型的别名

typedef int (*PF)(const char *, const char *)


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

typedef可以用来定义机器无关的类型,如

typedef long double REAL;


#define可以定义常量,编译开关等。

另外,作用域不同。

#define没有作用域的限制,只要之前预定义过的宏(即使在类定义中),在以后程序中都可以使用。

typedef有自己的作用域,但是我见过大部分的程序的typedef都是在头文件中,所以基本这条可以不用考虑。

 

还有,他们修饰指针时,作用不同。

typedef int * pint;
#define PINT int *
const pint p1;//p1不可更改,p指向的内容可以更改,相当于int * const p1;
const PINT p2;//p2可以更改,p2指向的内容不能更改,相当于const int *p;
pint s1, s2;//s1和s2都是int型指针
PINT s3, s4;//相当于int *s3, s4;s3是指针,s4不是。

 

通过上面的程序片段,我们应该能够更进一步的理解了define是简单的字符串替换,而typedef是才是真正的给一个类型起了一个别名,或者说是形成了一个行的类型。

 

总结typedef四种用途

1.定义类型的别名。(typedef int * pint

2.typedef 一个struct。(常见,忽略。)

3.定义与平台无关的类型。(typedef long double REAL;

4.为复杂的生命定义一个新的简单的别名。(typedef int (*PF)(const char *, const char *)

而关于#define,我认为要牢牢记住它是在预处理阶段的字符串替换,没有任何检查。欧了~

 

 

 

不足之处欢迎留言指出,不详指出可邮件询问(ljp827@gmail.com),此文可被转载,可被修改。

希望文章越来越完善,程序员工作压力越来越小,生活越来越多姿多彩(喂,醒醒)。

 

对了,再附一张图片,相信大家可以妥妥的搞定。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

define与typedef 区别

  • 2014-07-29 00:12
  • 15KB
  • 下载

typedef和define的区别与用法

typedef关键字和#define有一种共同的作用,为一种类型创建自定义的名字,如 typedef int myint; #define myint int 是一样的,但是他们之间仍然有很大的...

#define和typedef的区别

1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如: #define PI 3.141...

typedef和#define的用法与区别

一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef    int     ...

程序猿之---C语言细节21(#define和typedef区别、结构体细节)

#define和typedef区别、结构体细节

typedef和define的详细区别

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

typedef和#define的用法与区别

一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef    int     ...

typedef与#define的区别

typedef关键字用于为类型数据创建别名,通常的用法如下:typedef char* PCHAR;typedef struct list_node{ int value; list_...

typedef和#define的用法与区别

typedef和#define的用法与区别 一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内...

typedef和#define的用法与区别

一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef    int     ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)