对宏定义的一点疑惑

在宏定义#define PI 3.1415926中,3.1415926是一个字符串,那么在编译程序时,如果3.1415926参与算术运算,按理应该是不能进行的,因为字符串怎么能参与算术运算呢?而事实上3.1415926就参与了算术运算,这该怎么解释?

解释一: 这个问题我是这么看的,所有的源代码用人的眼光来看,都是字符,因为如果你不把它拿到机器上调试的话,它只是大量符号的组合。但从机器,确切说是编译系统的角度来看,就不全是字符了,是不是字符编译系统有严格的鉴别机制,就拿“3.1415926”来说,如果在源代码中以 "3.1415926"的形式出现,那么编译系统一定认为它是一个字符串,如果以 3.1415926 的形式出现,则认为是数值。 

宏定义中宏名后的东西不管是什么,都被认为是一串字符,这是语言规定的,为什么这么规定我不清楚。比如#define PI  3.1415926中的3.1415926是一串字符,#define PI  "3.1415926"中的 "3.1415926"也是一串字符。 

调试程序时,在预编译阶段,宏名被替换成其后的东西,这时候,“东西”还是字符串,但是在编译的时候,区别就显现出来了,就拿上例来说,如果是3.1415926,那么编译系统一定认为是数值,如果是 "3.1415926",那么编译系统一定认为是字符串,这都是语言本身的内在机制规定的,不这样,语言本身就会混乱不堪,自己就会崩溃,根本谈不上使用了。

区别就在编译阶段,这时候,语言本身的内在机制会严格鉴别字符和非字符,从而使程序顺利运行下去。

解释二:

宏定义  是  预编译  这个没有错吧

既然是预编译   那肯定还没有编译喽。

编译器是用来检测语法的。是以一定的规则来检测语法的。

宏定义在编译以前,当然没有  用编译的规则来衡量这些东西。

所以  宏定义(预编译)是字符串是很正常的事情。

永不止步步 发表于02-11 11:20 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:382741个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号