#define和typedef的区别

sms88 2005-04-28 08:28:30
#define和typedef都是进行替名?
...全文
1558 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cppprogramlover 2005-05-01
  • 打赏
  • 举报
回复
up
guofu_x 2005-04-29
  • 打赏
  • 举报
回复
lumenshan(babel)讲的非常透彻
QunKangLi 2005-04-28
  • 打赏
  • 举报
回复
typedef int * pint ;
#define PINT int *

那么:
const pint p ;//p不可更改,但p指向的内容可更改
const PINT p ;//p可更改,但是p指向的内容不可更改。
n88n 2005-04-28
  • 打赏
  • 举报
回复
typedef表示"定义类型",但用"别名"来描述更精确
#define 简单的告诉预处理器这个标记被定义.
xzgyb 2005-04-28
  • 打赏
  • 举报
回复
引用C专家编程的

#define int_ptr int *

int_ptr a, b; //相当于int * chalk, cheese; 只是简单的宏替换

typedef int* int_ptr;
int_ptr a, b; //a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符

所以区别还是很大的
newpuple 2005-04-28
  • 打赏
  • 举报
回复
同意whoho(在北方流浪) 的说法:
——————————————————————

#define是在于处理阶段进行替换的
typedef是在编译阶段进行处理的
#define仅仅作为替换处理,没有类型检查
typedef是有类型检查的,也有作用域的概念更安全一些

void fun()
{
#define A int
}

void gun()
{
//在这里也可以使用A,因为宏替换没有作用域,
//但如果上面用的是typedef,那这里就不能用A
}
yuchengliu 2005-04-28
  • 打赏
  • 举报
回复
顶!
#define是定义宏,是预处理命令,在编译之前进行宏展开, 只是做简单的替换, 不进行计算.
typedef是定义已有类型的别名。
winstonch 2005-04-28
  • 打赏
  • 举报
回复
1.从处理阶段区分:#define是在预处理阶段处理的,而typedef是在编译阶段处理.
2.从功能上讲:#define可以给类型起别名,也可以给常量,变量等等起别名,而且还可以用作编译开关, 而typedef只用用作定义类型别名.
whoho 2005-04-28
  • 打赏
  • 举报
回复
#define是在于处理阶段进行替换的
typedef是在编译阶段进行处理的
#define仅仅作为替换处理,没有类型检查
typedef是有类型检查的,也有作用域的概念更安全一些

void fun()
{
#define A int
}

void gun()
{
//在这里也可以使用A,因为宏替换没有作用域,
//但如果上面用的是typedef,那这里就不能用A
}
zhangfjj 2005-04-28
  • 打赏
  • 举报
回复
#define是定义宏,是预处理命令,在编译之前进行宏展开。
typedef是定义已有类型的别名。
lumenshan 2005-04-28
  • 打赏
  • 举报
回复
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如:
#define PI 3.1415926
程序中的:area=PI*r*r 会替换为3.1415926*r*r
如果你把#define语句中的数字9 写成字母g 预处理也照样带入。

2)typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,但是You cannot use the typedef specifier inside a function definition。

3)typedef int * int_ptr;

#define int_ptr int *
作用都是用int_ptr代表 int * ,但是二者不同,正如前面所说 ,#define在预处理 时进行简单的替换,而typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型。也就是说;

//refer to (xzgyb(老达摩))
#define int_ptr int *
int_ptr a, b; //相当于int * a, b; 只是简单的宏替换

typedef int* int_ptr;
int_ptr a, b; //a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符


这也说明了为什么下面观点成立
//QunKangLi(维护成本与程序员的创造力的平方成正比)
typedef int * pint ;
#define PINT int *

那么:
const pint p ;//p不可更改,但p指向的内容可更改
const PINT p ;//p可更改,但是p指向的内容不可更改。

pint是一种指针类型 const pint p 就是把指针给锁住了 p不可更改
而const PINT p 是const int * p 锁的是指针p所指的对象。

3)也许您已经注意到#define 不是语句 不要在行末加分号,否则 会连分号一块置换。


qrlvls 2005-04-28
  • 打赏
  • 举报
回复
#define 只是简单的字符串替换
typedef 是类型定义,有些是用 #define 无法替代的
例如
typedef void (*VoidFuncPtr)();
VoidFuncPtr pFunc;
KenYuan2016 2005-04-28
  • 打赏
  • 举报
回复
define定义宏,是预处理命令,在编译之前进行宏展开。
typedef是定义已有类型的别名。
跟一楼同解。
如 #define failure 0x00

typedef int a; 那么a 就是int 的别名
withc 2005-04-28
  • 打赏
  • 举报
回复
#define 是要编译处理的,并不是简单的替换。
const PINT P 等效预 int const * p;
PINT是个整体。const修饰的是 PINT,即整个 int *。
typedef 只是简单的替换。
sms88 2005-04-28
  • 打赏
  • 举报
回复
楼上的
const pint p ;
const PINT p ;
还原后,不都是const int * p 吗??

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧