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

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

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

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

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

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

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

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

搜索更多相关主题的帖子: include 编译器 
2013-11-02 20:26
未未来
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:182
专家分:157
注 册:2012-11-6
收藏
得分:0 
同问,
2013-11-02 22:43
xiaodu000
Rank: 2
来 自:黑龙江七台河
等 级:论坛游民
帖 子:52
专家分:42
注 册:2013-10-15
收藏
得分:2 
有点不懂楼主的意思,我也是刚学c++,我的理解是头文件中包含不同的关键字,指令什么的,你写的程序用到的东西都会在头文件中,像楼主这样的情况,是不是看下程序有没有确实用到其他头文件的地方,或者两个头文件之间有什么关联.我是这样想的
新手意见,大神勿喷。

写问题的同学不要手懒,有时候编译器说的东西胜过任何大牛!
2013-11-02 23:23
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
不会重复包含的...

下面这个例子讲的是.h文件的作用...
http://programonkey.me/to-c-file-and-h-the-concepts-and-relations/

至于重复包含:
h文件一般的写法不是这样的么
#ifndef XXX
#define XXX
...
#enddef

如果你觉得会重复包含,那你再回头去翻课本吧...


[ 本帖最后由 peach5460 于 2013-11-3 09:31 编辑 ]

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-11-03 09:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
学语言的时候,把重点放在算法上,就总会问这种最基础的问题,入门又不是一天两天了。

授人以渔,不授人以鱼。
2013-11-03 09:42
蚕头燕尾
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: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:182
专家分:157
注 册:2012-11-6
收藏
得分:2 
回复 6楼 蚕头燕尾
lz偏执狂,,,
2013-11-03 11:51
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
               

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

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

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-03 12:06
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:8 
以下是引用蚕头燕尾在2013-11-3 09:55:58的发言:

我就是特别想明白,到底我们所说的“头文件就像是一个要被用于复制的母本,凡是有包含它的地方就全部抄过去。”这句话

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

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

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


但是我现在的问题是:

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

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

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

【但愿我表达清楚了】

1,编译器确实是这么做的...
你问这个问题说明你看书看到include宏的时候不仔细...
include其实就是个文件拷贝替换...

2,为什么不会重复包含,因为有类似下面我写的那些防止重复的宏...
你说你知道这些宏是防止重复,我怎么感觉你不知道呢?

3,一般而言,尽量少在头文件里include东西,转而使用前置声明来声明相应的类型...
暂时不展开,呵呵...
你先自己领悟一下...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-11-03 17:43
快速回复:【头文件】自己写的头文件在编译的时候到底是起什么作用?
数据加载中...
 
   



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

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