请教傻孩子:关于书中P459的预编译过程
比如config.h 比如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"的提示.
谢谢。 1、不存在所谓的绑定说法。
2、#include的本质就是包含。
3、编译器只会编译.c文件
4、基于以上结论,所有包含了config.h的.c文件都会包含了clock.h和main.h……
还有:为什么我未在main.h中只能在本模块使用的变量前面加static标志会出现"multiple define"的提示.
这个情况你说得很不明确,理解不能……请粘贴一个能够复现故障的最小代码。 第一个是我理解上有问题,一个头文件可以被多个源文件包含,哪怕是“备而不用”,但是一个源文件不能包含同一个头文件两次,这才是重复包含。
第二个:比如:
一个工程中一共有五个文件:
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有什么区别?
谢谢,希望我的表述能让你明白。 .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实际上就是两个不同的变量,拥有不同的空间,因此系统
不再报错……
楼主清楚了么?
你应该仔细把那个章节再看一下…… 恩,谢谢,你的解释和你写书的风格一样。
书写的很好,我准备再买个10本8本的。。。。
再一次感谢 to 【5楼】 tota2004
多谢您的支持。
页:
[1]