搜索
bottom↓
回复: 6

请教傻孩子:关于书中P459的预编译过程

[复制链接]

出0入0汤圆

发表于 2009-5-30 17:03:52 | 显示全部楼层 |阅读模式
比如config.h

出0入0汤圆

 楼主| 发表于 2009-5-30 17:13:53 | 显示全部楼层
比如  config.h 中包含   #include"clock.h"
                        #include"main.h"

而我在clock.c和main.c中都有#include"config.h"。预编译器如何保证将main.h和main.c绑定的?会不会把两个都和clock.c绑定
还有:为什么我未在main.h中只能在本模块使用的变量前面加static标志会出现"multiple define"的提示.
谢谢。

出0入296汤圆

发表于 2009-5-30 19:53:44 | 显示全部楼层
1、不存在所谓的绑定说法。
2、#include的本质就是包含。
3、编译器只会编译.c文件
4、基于以上结论,所有包含了config.h的.c文件都会包含了clock.h和main.h……


还有:为什么我未在main.h中只能在本模块使用的变量前面加static标志会出现"multiple define"的提示.

这个情况你说得很不明确,理解不能……请粘贴一个能够复现故障的最小代码。

出0入0汤圆

 楼主| 发表于 2009-5-30 21:25:38 | 显示全部楼层
第一个是我理解上有问题,一个头文件可以被多个源文件包含,哪怕是“备而不用”,但是一个源文件不能包含同一个头文件两次,这才是重复包含。
第二个:比如:
        一个工程中一共有五个文件:
                                main.c          头文件  #include"config.h"

                                clock.c         头文件  #include"config.h"   当中的定时器中断服务程序用到了flag;

                                clock.h

                                main.h          当中定义了uchar flag=0;

                                config.h        头文件  #include"clock.h"
                                                        #include"main.h"
                                                        #include"iom48v.h"
                                                        #include"macros.h"
在定义flag时前面加static就会通过,如果不加就会出现multiple define的提示。
另外请问:multiple define和redefinition有什么区别?
谢谢,希望我的表述能让你明白。

出0入296汤圆

发表于 2009-5-30 22:19:58 | 显示全部楼层
.h里面不能有变量实体,这一点我在书中强调过了……
你在main.h里面有一个uchar flag=0;这显然是一个变量的实体,当clock.c和main.c都包含了config.h
以后,这两个.c文件都包含了main.h,于是就把flag变量声明了两次,在链接阶段,这就是一个典型的
重复定义“multiple define”,编译器说得没有错,一点都不冤枉。当你加入static以后,虽然同名
但是main.c里面的flag和clock.c里面的flag实际上就是两个不同的变量,拥有不同的空间,因此系统
不再报错……

楼主清楚了么?
你应该仔细把那个章节再看一下……

出0入0汤圆

 楼主| 发表于 2009-5-30 22:54:51 | 显示全部楼层
恩,谢谢,你的解释和你写书的风格一样。
书写的很好,我准备再买个10本8本的。。。。
再一次感谢

出0入296汤圆

发表于 2009-5-30 23:00:06 | 显示全部楼层
to 【5楼】 tota2004
    多谢您的支持。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 20:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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