tota2004 发表于 2009-5-30 17:03:52

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

比如config.h

tota2004 发表于 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"的提示.
谢谢。

Gorgon_Meducer 发表于 2009-5-30 19:53:44

1、不存在所谓的绑定说法。
2、#include的本质就是包含。
3、编译器只会编译.c文件
4、基于以上结论,所有包含了config.h的.c文件都会包含了clock.h和main.h……


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

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

tota2004 发表于 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有什么区别?
谢谢,希望我的表述能让你明白。

Gorgon_Meducer 发表于 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实际上就是两个不同的变量,拥有不同的空间,因此系统
不再报错……

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

tota2004 发表于 2009-5-30 22:54:51

恩,谢谢,你的解释和你写书的风格一样。
书写的很好,我准备再买个10本8本的。。。。
再一次感谢

Gorgon_Meducer 发表于 2009-5-30 23:00:06

to 【5楼】 tota2004
    多谢您的支持。
页: [1]
查看完整版本: 请教傻孩子:关于书中P459的预编译过程