百科问答小站 logo
百科问答小站 font logo



为什么C/C++要分为头文件和源文件? 第1页

  

user avatar   ling-jian-94 网友的相关建议: 
      

C时代的时候编译器比较简单,是固定的编译和链接两个过程,编译一次只处理一个文件,进行预处理之后,头文件会插入到这一个文件里,不同源代码文件的处理时独立的,这样如果头文件里面定义了一个函数的实现,编译的时候所有引用这个头文件的源码文件,生成的obj里都会有这个符号。而链接是通用的链接程序,从汇编时代就用的工具,没有什么高级功能,同一个符号链接时出现两次是会报错的。

但是,我们又说了,每个文件的编译是独立的,所以如果实现不在当前源文件里面,调用的时候编译器就不知道这个函数的类型和签名,没法生成调用代码,所以必须在调用之前先声明一遍。如果不把声明写在头文件里面,就必须在每个用到这个函数的源文件里都声明一遍,很不方便,所以综合之后的解决方案就是实现写源码文件里面,声明写头文件里面。

C++只是沿用了这个设计而已,实际上现在的C++编译器有处理符号重复定义的能力了(例如inline函数可以定义在头文件里面,但不必真的inline,也不需要像static函数一样每个文件生成一个符号),但是传统也是很重要的。

你的另一个问题,C调用DLL明明就是直接引用一个头文件啊……如果启用了预编译指令,一般还可以直接在头文件中指定链接一个外部库;否则需要额外链接一个obj文件,里面负责加载DLL。如果用动态的方式,则需要自己调用相应的API去加载DLL,获取导出点之类。


user avatar   jiangshengvc 网友的相关建议: 
      

因为编译出来的二进制码(比如.o,.obj,.lib,.dll)不包含自我描述的符号信息,要复用这种可执行码的话得另外的文件。C#和Java的可执行码自带元数据信息,但是这也意味着运行时的内存需求增加,毕竟这种自我描述的数据对最终用户来说是无用。当然在它们被发明的时候这些空间已经很便宜了,运行的时候浪费个几十K内存不是个事;但是C被发明的时候,64K的内存是四百多美元,给机器添加16或32KB内存的扩展槽,价格是三百美元(1980 Radio Shack Catalog Low-res page 171 of 176),一个程序经常几十个模块,运行的时候为每个模块去浪费几十K的内存是不可能的事情。

C++ 的Module包含元数据信息,不过提出来好几年了到现在还在讨论TS v1,不知道哪年才能进入标准……


user avatar   wzsayiie 网友的相关建议: 
      

我是一名基层派出所民警。

可以说当今中国警察普遍羡慕美国警察可以采取暴力手段绝对的镇压不法分子。

但是,不得不说,这次这位美国警察,太过分了,不仅是过分,而且我的理解是那已经构成了犯罪行为。那黑人已经制服了就可以正常上拷带走了,没必要一直压着脖子压那么长时间。没能置身其中不知现场那美国警察的所思所想,反正我个人挺不理解他为啥那样干的。

只能说无论什么地方,无论什么行业,只要是人的社会,都有像样的也有操蛋的吧。

_________此处为分割线 _________

以下为统一答复评论中有些人质疑的我所讲的羡慕二字。

能够出现这种质疑在我料想之中,因为中国警察也有过过分的时代,据我所知就是在七十八十九十年代,就如同地痞流氓,看谁不顺眼就能打谁对老百姓而言没王法可讲,那时候的警察说好听点可以说是威风凛凛说难听点儿是横行霸道。

但我想表明的是,时过境迁,现在的中国警察无论是受舆论约束还是因为法治社会建设制度规范都已经变得逐步文明与规范起来,起码我认为从我们现在开始从公安司法院校毕业参加公务员考试考进来的新一代警察已经具备新的面目,当然不可否认的是在这个行业内目前仍然存有历史的顽疾,仍然存在着臭虫,但我已经讲过无论什么行业都有操蛋的吧,这是个人问题,不是群体问题。相比之下,拍拍良心看,现在的整个警察队伍比照曾经确实过分的年代是不是已经是天地之别,问问曾经真正挨过曾经年代老警察欺负的中老年人就知道了。

为何会说起羡慕,因为警察每天面对的人群,大多是三教九流之辈,没有武力加身,很多事情在处理上警察显得软弱无能,说白了,好人谁没事儿上派出所转悠啊都忙着自己的生活呢,警察打人这句话,我们常常听到,但是但凡有点脑袋的人都能想明白,警察会闲着没事儿干把那在家里消停待着的遵纪守法的人抓起来暴揍一顿吗?

以上言辞不免更会有人质疑,请允许我解释,武力,当然不可滥用,我所说的羡慕不是羡慕美国警察的随意滥用武力,而是在合法范围内准许在对方不听从警察指令时动用武力,现在确实有人民警察法赋予了相关权力,但实践中现在的中国警察并不能或者说不敢执行人民警察法里的所有权力。拿防疫工作举例,卡口的工作人员在让出入的人员扫码登记时,就会有不愿意配合的人,然而这些不愿意配合的人可会知道工作人员的所做所为是为了整个社区的稳定安全,因为这整个社区包括了这名不愿意配合的人啊,在这个时候是否应当对其进行武力控制来保障其他居民的安全呢。同理,警察盘查也好,调查也好,总会有那些不愿意配合的人,自我感觉良好认为自己没问题所以警察不必要对其进行盘查所以就不配合,而警察当看到对方不配合时会以什么视角审视,难道要说谢谢您的不配合吗,万一这不愿配合的人真背着案子呢,那便是对更多的人民群众的不负责任。因此,我要说,民众的素质如果真正达到了人人互相敬重路不拾遗夜不闭户的文明程度,要求警察绝对文明不要有暴力举动,一点问题没有,一味强调了警察不该暴力执法而分毫不过问被执法对象自身是否存在问题,是不是看问题的角度些微的片面了些。

请注意,我说羡慕里的那句话尾巴实际已经表明了,羡慕的是暴力手段对不法分子的镇压,可不是对遵纪守法的百姓也要肆意妄为。例如像给群众办个身份证居住证之类的业务,警察当然应该热心服务。但当面对泼皮无赖时,还要笑脸相迎,得来的只有蹬鼻子上脸,警察都不怕了,您们认为这些无赖还有谁管得了。

列位存有异议的同志们,谢谢您们的教诲。言辞中犀利的同志们,谢谢您们的敦促。

让我知道当警察,需要吾日三省吾身。

还想要质疑甚或是骂的您们,若是能让您舒服,骂两句无妨。我不算您辱骂警察。不过是,道不同不相为谋罢了吧。

_____分割线

2020年6月5日22:53 出警在路上




  

相关话题

  编译器生成的汇编语句执行顺序为什么与C代码顺序不同? 
  为什么大多数人用C++时都要用&&,||和!来表示与或非,而不是用and or not? 
  大一新生入学半个月,有比赛需要一个月造出红外循迹智能车,会C语言和c++,要怎么开始入门? 
  int *p=new int,当free(p)时free函数是怎么知道要释放4个字节而不是5个的? 
  C++的new操作符,底层使用的是malloc吗,在析构时,是如何确定自己需要释放内存的大小的? 
  C++ 类当中为什么要有private? 
  为何对于无符号数,右移必须是逻辑的? 
  C语言和C++中,为什么malloc函数需要传入申请的内存大小,而free时候却不需要传大小呢? 
  在C++中,为什么部分程序员喜欢在循环中写‘++i’而不是‘i++’? 
  0除以0怎么使用c++的异常处理,例如try? 

前一个讨论
好的或者成功的项目,代码就一定美吗?
下一个讨论
16K采样率去采1kHz正弦信号,然后每隔1秒丢掉一个sample,这样的音源播放时为何会有啪啪声?





© 2024-11-25 - tinynew.org. All Rights Reserved.
© 2024-11-25 - tinynew.org. 保留所有权利