关闭

typedef和define的区别

标签: 面试bt编译器工作structc
152人阅读 评论(0) 收藏 举报
分类:

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),此文可被转载,可被修改。

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

 

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13554次
    • 积分:288
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章存档