| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3667 人关注过本帖
标题:【头文件】自己写的头文件在编译的时候到底是起什么作用?
取消只看楼主 加入收藏
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
结帖率:96.08%
收藏
已结贴  问题点数:20 回复次数:10 
【头文件】自己写的头文件在编译的时候到底是起什么作用?
我一直是这样理解的:

头文件就像是一个要被用于复制的母本,凡是有包含它的地方就全部抄过去。

但是我今天碰到一个问题:

是头文件里自己定义一个class,如果我前面理解的是对的话,为什么这个头文件里依然要写

#include <iostream>
#include<string>
using namespace std;

这样的代码才能编译通过呢?

如果是这样的话,我在主函数所在文件里面已经包含了这样的三行,不是就相当于重复包含了么?

那么这个头文件(我知道它是不单独编译的),编译器到底在编译的时候对它做了什么?

搜索更多相关主题的帖子: include 编译器 
2013-11-02 20:26
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
我就是特别想明白,到底我们所说的“头文件就像是一个要被用于复制的母本,凡是有包含它的地方就全部抄过去。”这句话

是一种逻辑上的等价理解,还是说编译器实际上就是的的确确这么做的?

如果的确就是这么做的,为什么不会重复包含?明明就是头文件里已经写了这些语句了的,你在别的已经包含了这个头文件的文件里再写一遍,不是写重复了吗?

至于:
#ifndef XXX
#define XXX
...
#enddef
我知道这是常用的用于避免“无意间”重复定义了某个东西,比如说class


但是我现在的问题是:

我觉得头文件里没有必要去写
#include <iostream>
#include<string>
using namespace std;
这样的东西,或者说我觉得根本就是非常的不应该在头文件里写这些语句!因为客户程序员根本不知道你已经在头文件里包含了iostream这样的东西了呀,

他自然会在使用这个类的时候再包含一遍iostream这样的东西,如果项目很大的话,岂不是就像是明明有用的代码只有一万行,而我们却要编译三万行这样的?

我想为什么就不能养成一个好的编码习惯,让写出的代码尽可能的“没有废话”呢?

【但愿我表达清楚了】

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-03 09:55
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
而问题的关键就是,我很不明白,为什么如果   我不写   我上面提到的   我认为可以不写的   那些代码的话,会编译报错?

这就是我的问题。


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-03 09:58
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
               

这是一个很现实的问题好不好。。。

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-03 12:06
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
实际条件?这话是什么意思?

难道我在头文件里不写那些语句,就会被编译器认为是“不合法”的一种“实际条件”吗?

那这个编译器岂不是太不讲道理了哎……


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-03 20:47
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
bloody hell

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-04 05:32
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
等我解决了这个问题,要自己来回答这个问题。


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-05 09:10
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
勿在浮砂筑高台

好熟悉的一句话啊,侯俊杰的话?


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-05 13:53
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
回复 24楼 peach5460
3你们说的这些我之前也是有所耳闻的,

关于那个宏定义防止重复定义的道理我想我是大概懂得的,因为自己写的代码就一直是遵循了这样的方法。

关于   编译器的预处理都做了些什么工作  我也了解过一些。

我的问题的关键不在这里,而是在后面:

为什么不在头文件里写我前面提到的那样几句代码就会报错。

基于前文所述的理解,写上那些代码的话要通过编译器的预处理进行“排除重复”【这里我不想讨论具体是采用了什么样的技术或者原理进行了“排除重复”,只是表达了这样一个意

思:在编译器未进行“排除重复”工作之前,代码确实是有重复的部分存在】

而我的疑问是:

如果我不在头文件里写那几行代码,是不是也应该是“不缺代码”的,只是编译器不用进行“排除重复”的工作了而已,我认为这样做也不应该是错误的。就是我们的代码没有重复的部

分了而已。且不论这样做是否有益,我所强调的是:这样做不该是错误的做法!

而实际情况是:

这样做却是错误的!要想不报错,就得在头文件里写上那几行代码,这与之前的理解完全相矛盾。甚至可以推测“编译器根本就没有进行排除重复工作,因为在它看来,在头文件里有那

几行代码是没有形成重复的”,而这一点与我之前的理解相违背。

【我的这个提问,目的不是为了问怎样去避免代码出现重复定义,也不是为了知道编译器是如何处理或者避免重复代码,我想知道的是:为什么我觉得会出现重复代码的情况下,我删除一部分的重复代码会出错,或者说,为什么我认为会出现重复代码的情况下,编译器却认为并没有重复代码出现。所以我质疑我之前的概念:头文件不单独编译,只是遇到包含语句的时候全盘复制过去。。。因为这个观点在这个情况下是解释不通的】


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-06 03:33
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
我想我这个人可能是有代码洁癖吧,一直奉承“用什么写什么”的观点

比如在一些小的练手的程序里,我更倾向于写using std::cout; using std::cin;   using std::endl;    而不是using namespace std;

比如:有一次一个朋友就是用了后者方式,结果定义了一个friend函数,函数名为distance,自然是报错的了

因为后者包含了using std::distance

这些错误往往都是莫名其妙,需要一定的经验才能排错,我费了将近十分钟才搞明白原因,从此对一些看起来“很大”的语句的使用都很小心。

或许我的这个问题有点就像前面某楼说的“偏执狂”,但我是真心的想知道这是为什么……


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-06 03:44
快速回复:【头文件】自己写的头文件在编译的时候到底是起什么作用?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024439 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved