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

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

 

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

typedef和#define究竟有什么区别?

typedef int * int_ptr ; 与#define int_ptr int * 作用都是用int_ptr代表 int * ,但是二者不同,正如前面所说 ,#define在预处理 时进行...
  • Pwiling
  • Pwiling
  • 2015年08月16日 21:20
  • 1250

详解typedef用法及define的区别

1.typedef语法描述      在现实生活中,信息的概念可能是长度、数量和面积等。在C语言中,信息被抽象为int、float和double等基本数据类型。从基本数据类型名称上,不能看出其所代表的...
  • xiao3404
  • xiao3404
  • 2014年03月28日 17:26
  • 1677

C++中define与const的区别

C++中不但可以用define定义常量还可以用const定义常量,它们的区别如下: 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常...
  • yingyujianmo
  • yingyujianmo
  • 2016年04月21日 10:20
  • 3817

define与typedef 区别

  • 2014年07月29日 00:12
  • 15KB
  • 下载

typedef和#define的用法与区别(是我转来的,但是确确实实是我碰到的问题,能把他吃透也就是我自己的东西啦)

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

typedef和#define的用法与区别

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

C语言中的typedef(包含与#define的区别)

今天在做一个编程练习的时候,想要
  • u011446018
  • u011446018
  • 2014年05月19日 16:12
  • 410

typedef和#define究竟有什么区别?

typedef int * int_ptr ; 与#define int_ptr int * 作用都是用int_ptr代表 int * ,但是二者不同,正如前面所说 ,#define在预处理 时进行...
  • Pwiling
  • Pwiling
  • 2015年08月16日 21:20
  • 1250

typedef的用法好处及与#define的区别

typedef的用法好处及与#define的区别 #include "stdafx.h" #if 0 ----typedef的使用步骤: typedef typer name; 起别...
  • SwordArcher
  • SwordArcher
  • 2017年11月15日 20:21
  • 74

结构体,共用体,typedef与define的区别,链表

首先自己发现的一点不懂的 定义:字符的赋值  char a='A';                   char a[10]="A";   结构体: 1:结构体是一种构造数据类型, 2:结构体里...
  • laofengge
  • laofengge
  • 2016年08月16日 19:28
  • 304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:typedef和define的区别
举报原因:
原因补充:

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