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

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


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

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-05 13:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
还没想明白?与处理器把所有.h嵌入到代码文件中,如果最开始的.h已经声明了一个宏标识,那么后续嵌入的.h内容就被#ifndef废掉了,这样的设置不管嵌入多少次,都不会有影响,实际上等于一次。源文件文本巨大没关系的,编译和链接处理会把不需要的东西剔除,这就是编译型语言的优势——不要被源代码欺骗自己,你看到的与编译器看到的很可能是两回事。

授人以渔,不授人以鱼。
2013-11-05 14:28
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
以下是引用蚕头燕尾在2013-11-5 13:53:41的发言:

勿在浮砂筑高台

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


嗯,侯杰<MFC深入检出>里面的话,我很喜欢
打好基础才能去玩技巧,要不然,总会摔跤的...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-11-05 17:30
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
以下是引用TonyDeng在2013-11-5 14:28:10的发言:

还没想明白?与处理器把所有.h嵌入到代码文件中,如果最开始的.h已经声明了一个宏标识,那么后续嵌入的.h内容就被#ifndef废掉了,这样的设置不管嵌入多少次,都不会有影响,实际上等于一次。源文件文本巨大没关系的,编译和链接处理会把不需要的东西剔除,这就是编译型语言的优势——不要被源代码欺骗自己,你看到的与编译器看到的很可能是两回事。

为楼主补充一下:
如果实在还是搞不懂的话...
去搜一下C++编译器相关的知识...如果你去看编译原理更好...

C++的编译首先经过预处理,词法分析,语法分析...(具体记不清了,我讨厌记概念)...
其中预处理,就是将宏展开,并且将可计算值进行计算,等等...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-11-05 17:33
蚕头燕尾
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
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
哦,我一直以为你是不知道头文件的作用...
看来我理解错了一部分...你还是知道一点的...
但是我还是要说你不理解头文件的作用...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-11-06 08:13
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
首先,你要搞清楚,编译的时候,不可能是把所有文件合并到main的文件里面去,组成一个超级庞大的文件再进行编译
C++的编译模型是分别编译,再链接...
那么分别编译的时候你就要保证编译的通过...

不可能像你在1L写的...我主工程包含过了,其他工程就不需要了...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-11-06 08:18
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

你看到的是文件...
但是编译器看到的是编译单元...
你必须保证编译单元内可编译有效...

而不是你在最开始说的,我主项目文件包含过了,其他的都不用包含...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-11-06 08:27
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
哈,我想斑竹终于明白我的问题了……

虽然我还不太理解这里的“编译单元”的概念【之前没听过这个词】

但是我知道这样一点:头文件不能编译【其实对此我也有个小疑问:如果我想写一个头文件给别人用,注意,就一个头文件,没有其他的代码了,而且我又不想开源,我该怎么办?】

正因为头文件的“不单独编译”,所以我觉得头文件里可以随便写,写什么都行,反正它就是一个要用于复制的“母本”呗,只要你把它放到你#include的地方能够前后文合理就ok了呗。

可事实并非如此~!!!!头文件不是爱写什么就写什么的!!!这是为什么呢?

这就是我为什么要问:头文件究竟是起了什么作用?究竟是不是我理解的“复制母本”的作用!!!

我还没有学编译原理,对编译器的一些行为不是很理解~~我想我应该为此查一下编译原理

~~~~还是谢谢斑竹啦~~~~


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

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



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

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