找回密码
 注册
搜索
查看: 2997|回复: 16

[讨论] 宏定义到底占不占内存?

[复制链接]
发表于 2010-9-2 13:30:46 | 显示全部楼层 |阅读模式
#define  board_ver    2


#defien __mtk__


如果不占的话,怎么值放在哪里?
 楼主| 发表于 2010-9-3 08:20:29 | 显示全部楼层
以下是引用ly85206559在2010-9-2 16:09:58的发言:
上面说的 和你的理解不冲突的。
#define M                3//宏常量                                这句话是不分配内存的。
int I=M;//预编译期间进行宏替换,分配内存
int J=M;//再进行宏替换,又一次分配内存
这个相当于 int i,j;系统肯定是要分配内存的

书上的意思是为M分配内存,不是指I J等,所以我就不明白

单个INT I ,J;我也知道要分配内存的
点评回复

使用道具 举报

发表于 2010-9-2 16:09:58 | 显示全部楼层
上面说的 和你的理解不冲突的。
#define M  3//宏常量    这句话是不分配内存的。
int I=M;//预编译期间进行宏替换,分配内存
int J=M;//再进行宏替换,又一次分配内存
这个相当于 int i,j;系统肯定是要分配内存的
点评回复

使用道具 举报

 楼主| 发表于 2010-9-2 15:39:47 | 显示全部楼层
你的理解跟我一样,但是我今天重温《C语言深度剖析》时,还是哎特了。

里面说到:

#define M  3//宏常量
const int N=5;//此时并未将N放入内存中
......

int i=N;//此时为N分配内存,以后不再分配
int I=M;//预编译期间进行宏替换,分配内存

int j=N;//没有分配内存
int J=M;//再进行宏替换,又一次分配内存
------------------------------------------------

[em06][em06][em01][em02][em03][em04][em05][em06][em08][em07][em09][em10][em11][em12]
点评回复

使用道具 举报

发表于 2010-9-2 14:42:14 | 显示全部楼层
宏是预编译的。编译之后就都替换了。不占空间
点评回复

使用道具 举报

发表于 2010-9-4 19:42:16 | 显示全部楼层
竟然这个也成了问题?
点评回复

使用道具 举报

发表于 2010-9-4 13:02:07 | 显示全部楼层
以下是引用hztianxie在2010-9-3 16:09:37的发言:
书上还有这么一段话:const定义的变量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态区)

而用#define定义的宏常量在内存中有若干个拷贝。

------------------------------

回头看
#define M                3//宏常量
const int N=5;//此时并未将N放入内存中
......

int i=N;//此时为N分配内存,以后不再分配
int I=M;//预编译期间进行宏替换,分配内存

int j=N;//没有分配内存
int J=M;//再进行宏替换,又一次分配内存
------------------------------------------
所以我的理解是M这个宏常量,是分配内存的。

楼主小白了,宏只是编译的时候的简单替换,和内存有个毛的关系啊。
const int i=3

#define N   3
const int i=N
这两个语句,i的存储空间是完全一样的。只不过一个是编译的时候就给了一个立即数赋值,另外一个是编译的时候,由编译器帮您替换成立即数赋值。
这还有什么好疑问的呢?
点评回复

使用道具 举报

发表于 2010-9-4 12:53:48 | 显示全部楼层
理解有问题,宏预编译时就替换了,程序运行时,并不分配内存。
注意,运行时。
点评回复

使用道具 举报

发表于 2010-9-4 02:11:46 | 显示全部楼层
呵呵,楼主理解的有问题
点评回复

使用道具 举报

发表于 2010-9-3 20:15:04 | 显示全部楼层
说的我也迷糊了
点评回复

使用道具 举报

发表于 2010-9-3 17:37:08 | 显示全部楼层
C语言没学好哈!鉴定完毕!
点评回复

使用道具 举报

 楼主| 发表于 2010-9-3 16:09:37 | 显示全部楼层
书上还有这么一段话:const定义的变量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态区)

而用#define定义的宏常量在内存中有若干个拷贝。

------------------------------

回头看
#define M  3//宏常量
const int N=5;//此时并未将N放入内存中
......

int i=N;//此时为N分配内存,以后不再分配
int I=M;//预编译期间进行宏替换,分配内存

int j=N;//没有分配内存
int J=M;//再进行宏替换,又一次分配内存
------------------------------------------
所以我的理解是M这个宏常量,是分配内存的。
点评回复

使用道具 举报

发表于 2010-9-3 13:15:56 | 显示全部楼层
新手路过,看高手巅峰对决
点评回复

使用道具 举报

发表于 2010-9-3 12:53:10 | 显示全部楼层
#define N 5
main()
{
int i=N;//
......
}
请问这样的编译能通过吗??
点评回复

使用道具 举报

 楼主| 发表于 2010-9-3 12:38:45 | 显示全部楼层
以下是引用yangyanpo在2010-9-3 9:22:04的发言:
我的理解和4#一样,你的理解我以为是错误的


int i=N;//此时为N分配内存,以后不再分配

如果这样的话,那为什么不写“此时为I分配内存呢?
点评回复

使用道具 举报

发表于 2010-9-3 11:46:57 | 显示全部楼层
宏定义怎么会占内存呢?
预处理的时候替换了。
点评回复

使用道具 举报

发表于 2010-9-3 09:22:04 | 显示全部楼层
我的理解和4#一样,你的理解我以为是错误的
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2025-1-3 02:40 , Processed in 0.090939 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表