C++中没有.h的头文件

4

我遇到了一些问题,无法包含标准头文件,例如iostream.hfstream.h。在我的系统中,在usr/include/c++/4.3下,没有任何一个文件的扩展名是“.h”(例如,只有iostream而不是iostream.h)。

这本来没什么问题,但我正在尝试使用另一个库,DCMTK,它会执行像#include<iostream.h>这样的操作。不幸的是,在我的系统上并没有“iostream.h”,只有“iostream”,这意味着我的编译器会给出类似于error: iostream.h: No such file or directory的错误。

我想我可以从iostream.h创建软链接到iostream,但这似乎会在将来带来麻烦,并且非常恼人。是否有其他解决方案?

为了完整起见,我正在使用以下命令进行编译:

g++ -o gc_on_ctp -g -Wall -Idicom/include -Ldicom/lib gc_on_ctp.cpp -ldcmdata

正如你所想象的那样,头文件位于dicom/include下,库文件位于dicom/lib下,名称为libdcmdata.a。


8
iostream.hfstream.h不是标准的头文件。 - dan04
1
为了进一步解释@dan04的评论,带有“.h”后缀的头文件来自于C++库的非标准化版本。 - user23743
感谢大家提供详尽且非常快速的答案! 另外,为了避免诋毁DCMTK的名誉,他们实际上确实使用标准头文件,我只需要包含一个配置头文件来设置一些宏。 再次感谢! - user220878
1
可能是为什么g++找不到iostream.h?的重复问题。 - phuclv
4个回答

7
我建议你看一下这里。它解释了为什么和何时出现了iostream.h / iostream,它的存在原因以及如何解决这些问题。
主要考虑到iostream.h已被认为是不推荐使用不可靠实现特定的,如果用iostream代替它,可能会导致错误。

主要是要考虑到iostream.h已经被视为过时的。不,<iostream.h>不能被视为已过时,因为它从未成为标准的一部分。请参考附录D(ISO C++-98)中列出的过时特性列表。 - Prasoon Saurav

6

只需创建一个新的iostream.h文件,其中只有一行代码:#include <iostream>。这似乎是DCMTK的一个大错误,因为标准规定这些文件名中不应该有.h。


4
这是一个常见的解决方案 - Qt 在其他方面也使用它。过去更为常见,因为一些编译器无法处理没有 .h 后缀的文件! - Martin Beckett
1
不要将此与<cstring> <string.h>头文件问题混淆。那是稍微不同的。 - Chris Huang-Leaver
@Chris 很好的观点。我建议仅限于文件<->文件.h之间的操作。 - Gianni

3

这些头文件已经过时/不是标准的。在gcc中,我相信它们现在被放置在#include <backward/iostream.h>等位置。

另一方面,如果您链接的库需要一个旧版本的不兼容标准库,那么您可能会遇到更多问题。


1

我会修复这个(过时的)库。你可以使用原地正则表达式搜索和替换来完成:

perl -e "s/iostream.h/iostream/g;" -pi $(find . -iname "*.cpp")

或者

find . -iname "*.cpp" -print0 | xargs -0 sed -i 's/iostream.h/iostream/g'

注意:在执行此操作时要小心……它会递归地影响从您开始的路径中的所有文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接