首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

头文件宣言

2013-11-05 
头文件声明本人菜鸟,对编译不在理解现在遇到个问题, 我现在有 A B C三个文件 A为主文件(main函数入口) B为

头文件声明
本人菜鸟,对编译不在理解
现在遇到个问题, 我现在有 A B C三个文件 A为主文件(main函数入口) B为一个类
另外有些自己定义的宏定义声明在C文件中
要在A中使用B  并且在A B 中都有使用到C中的宏定义
引用方式是 在A 中
#include "C"
#include "B"
这样引用的,但是报错在B中无法找到C中定义的宏定义, 而在B中再引用又会重复定义,只有在C中加入防重复定义 就解决了
但我不解的是,为什么会造成这样。如果报重复定义,也就是说在编译B的时候已经找到了C中的定义,但在B中如果不引用C,却又说找不到定义。
这到底是怎么回事。 要如何解决 
再说个例子, 我在A中引用了 string 在B中也要用,现在B中却说找不到string
我在A中引用B之前已经先引用了string的头文件 为什么会出现这种情况  各位大神,求解啊。
[解决办法]
一个类里面定义了,另一个类要引用吧。我表示也遇到过

http://bbs.csdn.net/topics/390624327?page=1#post-395906766
[解决办法]
1、.h头文件的作用只出现在预编译阶段,预编译后.h文件就失去了价值,也就是说一个.cpp文件为一个编译单元,一个.cpp文件最终生成一个.o文件
 2、.h头文件应该包含些什么?
 a. 包含声明、条件预编译指令以及类的定义(类的定义一定要有条件预编译指令,否则多个文件包含会出现重定义错误)
 b. 包含需要的的头文件,无关的头文件都不需要包含,cpp使用的头文件都放入cpp文件中,或者单独建立一个总体的头文件包含所有需要使用的头文件
 c. 包含常量(包括const常量声明,定义放在源文件中)和宏定义 

至于“比如用到模版,要用到变量来实例化数组的时候,,所有实现也基本在.h中完成。”
http://bbs.csdn.net/topics/270077671

希望能改变你的一些观点
[解决办法]

引用:
Quote: 引用:

编译时,编译器会将头文件全部展开,如果没有定义宏防止重复,就会有2份C的定义存在,不是说B找到了C的定义,而是展开的时候B发现C的定义与前面冲突了,所以报C的定义重复的错,而如果不包含C的话,B就会找不到所引用的内容,自然会报找不到定义的错。你在Linux下也一样,编译的时候去掉C的引用,编译可以通过,因为B会把之前重复的C的定义当做自己的引用,而下次B中没有引用C,自然又找不到C了。所以,定义宏防止重复才是王道。


前边个我理解, 确实是展开,出现多个定义,但后边个我就不太理解了。  
按理解,如果都是展开的话,那和,在之前已经引用了,在B中就是不引用 也应该能找到之前的定义。因为我的引用 是在程序调用B文件之前的。
所以我还是有点不太明白,请指教一下,谢谢

引用意在指明当前源文件中所用的各种类型从哪里找到定义,B可以找到之前的C定义,但是你不告诉B它需要引用的是哪个,它就不能确定所需要的类型是C提供的。

热点排行