enum和define的区别?

LubinLew 2012-05-11 01:10:12
#define 的宏会在预处理时替换, enum却不会替换,那enum定义也不占用空间, 那enum是如何工作的?


/* enum.c */
#if 1
#define ONE (1)
#else
enum Tags
{
ZERO,
ONE,
TWO
};
#endif

int main()
{
int x = ONE;
return 0;
}


gcc -E -P enum.c


int main()
{
int x = (1);
return 0;
}

/*****************************************************************************************/

/* enum.c */
#if 0 /* Change */
#define ONE (1)
#else
enum Tags
{
ZERO,
ONE,
TWO
};
#endif

int main()
{
int x = ONE;
return 0;
}


gcc -E -P enum.c


enum Tags
{
ONE,
TWO,
ThREE
};

int main()
{
int x = ONE;
return 0;
}
...全文
567 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
daxiongjituan 2014-01-26
  • 打赏
  • 举报
回复
貌似你们都是2012年回的,14的伤不起
wmxfdfj 2012-05-11
  • 打赏
  • 举报
回复
enum应该占四字节的内存吧?define不占内存
iamnobody 2012-05-11
  • 打赏
  • 举报
回复
宏不是个东西.只是替换.

enum 是一个实体.enum 的值也不保存在内存中.

内存不能解释的C 语言现象多了去了..


enum 是根据C 语言的要求工作的.

或者说间由C语言的机制驱动的.
帅得不敢出门 2012-05-11
  • 打赏
  • 举报
回复
宏是简单替换
不会时行类型安全检查

枚举则会进行类型安全检查

宏不可调试
赵4老师 2012-05-11
  • 打赏
  • 举报
回复
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
qq120848369 2012-05-11
  • 打赏
  • 举报
回复
define和enum基本一样的东西,只不过一个没类型,一个有类型。

真正用起来,习惯性的define一些独立的东西,enum一系列东西。

typedef enum {
TCP,
UDP,
UNIX
}type_t;

这样总比define写成这样好看吧?

#define TCP 1
#define UDP 2
#define UNIX 3
sheldenwade1 2012-05-11
  • 打赏
  • 举报
回复
#define N 10
宏定义是在预处理的时候将所有的N替换为10,预处理是在编译之前。
而enum是在编译的时候,进行替换。
处理的时机不一样,但均不占用内存空间
自信男孩 2012-05-11
  • 打赏
  • 举报
回复
宏可以定义函数,enum不可以的。
franzhong 2012-05-11
  • 打赏
  • 举报
回复
了解不多,小猜测一下,高手给我指正学习
个人猜测:
enum会不会是聚宏啊
里面是有值的,就算你不赋值系统会自动从0开始自动递增的进行赋值操作
赋值也只能声明之时赋上,以后都不能修改,和宏无二样
enum所谓枚举就是体现了其作用,有集合的概念
也能解释了enum特殊情况下是会被自动提升为算术类型
肯定会占内存的吧,多少是编译器决定的1<= sizeof(enmu)<=sizeof(int)





majia2011 2012-05-11
  • 打赏
  • 举报
回复
enum是程序思想;define是工程思想。
gemo 2012-05-11
  • 打赏
  • 举报
回复
都差不多,enum就是一个整数,对应一个符号而已
W170532934 2012-05-11
  • 打赏
  • 举报
回复
宏的定义在预处理阶段就可以确定了。所以直接给你替换掉了嘛
jackyjkchen 2012-05-11
  • 打赏
  • 举报
回复
enum和define都是高级语言层面的东西

编译过之后,他们都是常数……

所以,不用太纠结,知道怎么用就行了

69,371

社区成员

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

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