C++的include里面不带.h是设计失误?

東條・スペンサー・咲 发布于 2015/04/18 13:50
阅读 2K+
收藏 0

前几天某人说:C++的头文件不带.h其实是设计失误。

给出了如下的理由:

旧的编译器的模板类的实现和声明必须放在同一文件内不然会有bug。这并不是什么值得提倡的事情……

然后我就十分想不明白这个和头文件最后带不带.h有什么关系- -

最后他是这么说的:

总之我的逻辑是:
设计STL的人没有给文件+.h(实际上加了也能编译过)
-》为了和其他的.h显示明显区别(什么明显区别?)
-》C和C++的.h都是只有类/结构/函数声明没有实现的,但是STL的模板有
-》有实现的头文件就不加.h了
-》为了统一把所有STL的头文件都不加.h了(它们都是std的命名空间内的)

于是这个和最后带不带.h有什么关系么- -?小弟学C++尚浅,想知道C++的头文件不带.h到底是不是所谓的设计失误。

(我觉得他这么说纯属胡闹)

加载中
6
東條・スペンサー・咲
東條・スペンサー・咲

Okay,这个问题已经写邮件询问过Bjarne Stroustrup,他的回复原文如下:

The committee decided that the .h was unnecessary to establish a connection between a compiler and its standard libraries, that removing it was a good way of eliminating compatibility problems with pre-standard versions of headers, e.g. "iostream.h" vs. <iostream>. Also, there were implementations that did not use ordinary character files to hold their standard headers (I don't know if there are any now).

The decision had nothing to do with templates.

I don't miss the .h.

所以,这种事情还是问作者本人最靠谱了。

0
中山野鬼
中山野鬼
先用吧。哈。想太多,只会让你更混乱。你先按照你手上编译器的要求来设计就是了。
中山野鬼
中山野鬼
回复 @东条咲 : 心醉与研究c++的,都不是人,都是神。我算野鬼,全当我不懂c++,因为里面脑筋急转弯和智力题太多。没心思猜测和学习各种概念。哈。
東條・スペンサー・咲
東條・スペンサー・咲
现在没什么设计,只是学校刚开C++课,我们年级的“学神”发表的高论,说是这个设计有问题。旧闻野鬼前辈大名,请前辈说说看法。
0
m
magiclogy

是不是设计失误我不知道。反正string.h和string是不同的东西,至于为什么不用.hpp后缀我也不知道。

但是,正常情况下,只要是头文件一定会有后缀,和用不用模板没太大关系,Boost所有头文件都是.hpp后缀。当然,对于编译而言,头文件后缀不是问题,因为#include操作基本相当于复制粘贴,.c,.cpp倒是很重要。

而且,模板类的实现和声明放在不同文件里面,最后还是得同时include进去,export也一直没能假如标准。

東條・スペンサー・咲
東條・スペンサー・咲
我是这么认为的……
東條・スペンサー・咲
東條・スペンサー・咲
string和string.h确实是不同的东西,这个倒是没什么问题。后缀是什么不是问题这一点我也是这么认为的。姑且不论模板类如何如何,这个跟include后面不带后缀应该是半点关系都没有。
0
公孙二狗
公孙二狗
例如 #include <vector>,实际上在 vector 这个文件里的内容是 vector.h
東條・スペンサー・咲
東條・スペンサー・咲
大部分确实是这样,包括Qt里面都是#include <QList>然后跟踪QList会发现里面就一句话:#include "qlist.h" 但也有例外,举个最简单的栗子:iostream,里面除了include之外还做了一些额外的操作。#include <vector.h>找不到是有可能的,类似于iostream只有一个不带后缀名的文件。 但问题是,他说的这个所谓设计问题是否存在?
月落苍穹
月落苍穹
开玩笑的吧。就我用的编译器,有vector,但是没有vector.h,一旦#include <vector.h>就报文件找不到……
0
z
z8281826
stl为了统一早期兼容c的头文件和后来的各种std命名空间的库文件就用不带.h后缀的文件包含h文件,同时加上命名空间,这样你可以使用带h的头文件,像c一样编程,也可以使用不带h的文件实现c++风格的编程
東條・スペンサー・咲
東條・スペンサー・咲
当时有人说过STL统一std命名空间这个原因,但是我认为跟这个没有任何关系,还是iostream的例子,首先iostream不是STL,那么为何它不带后缀?C++风格这一点我是支持的,猜测有可能是发明者希望这些功能能够像一个模块一样,写成#include <模块名>的形式,所以就不带后缀名了。
0
z
zhaoyongCNSX
其实不用.h是C++故意而为之的
0
ikel
ikel
我的理解c++编译器在寻找的时候会自动加上.h的
0
東條・スペンサー・咲
東條・スペンサー・咲
作者都亲自发话了(已经设为答案),于是都不用猜了- -
0
木兰宿莽
木兰宿莽
在cpu看来都是0和1,CPU:呵呵,小样,马甲随意换
0
Force武装卫队
Force武装卫队

实际上你得理解 include 本质上就是插入文件,经常有

#include <xxxx.inl>

这类写法,标准库不带 .h 也是为了与以前的区分,比如

#include <string.h>
#include <string>
二者完全不是同一个东西。

Force武装卫队
Force武装卫队
第二句说了是区分,第三句举例了
東條・スペンサー・咲
東條・スペンサー・咲
我们讨论的并不是说include的本质是什么,他的意思是说STL的文件名不加.h是设计上的失误,我的回答就是这个最多也就是和以前的库加以区别,有可能是这么写看起来更像是包括了一个模块的感觉。 我们只是讨论这个是不是真的设计失误,这个问题的答案我已经问过bjarne了,具体回答在一层。
返回顶部
顶部