我的类定义一直使用*.h文件,但在阅读了一些boost库代码后,我意识到它们都使用*.hpp。我一直很讨厌这个文件扩展名,我想主要是因为我不习惯它。
使用*.hpp而不是*.h的优点和缺点是什么?
我的类定义一直使用*.h文件,但在阅读了一些boost库代码后,我意识到它们都使用*.hpp。我一直很讨厌这个文件扩展名,我想主要是因为我不习惯它。
使用*.hpp而不是*.h的优点和缺点是什么?
当前回答
Codegear c++ Builder使用.hpp作为从Delphi源文件自动生成的头文件,使用.h文件作为“自己的”头文件。
所以,当我写一个c++头文件时,我总是使用.h。
其他回答
编辑[增加了Dan Nissenbaum的建议]:
根据约定,当原型在头文件中定义时,使用.hpp文件。对于模板,头文件中的这种定义很有用,因为编译器只在模板实例化时为每种类型生成代码。因此,如果它们没有在头文件中定义,它们的定义将不会在链接时从其他编译单元解析。如果你的项目只使用c++,并且大量使用模板,这个约定将会很有用。
某些遵循此约定的模板库提供带有.hpp扩展名的头文件,以表明它们没有相应的.cpp文件。
另一个习惯是用.h表示C头文件,用.hpp表示c++头文件;boost库就是一个很好的例子。
引用自Boost FAQ, 文件扩展名向人类传递文件的“类型” 还有计算机程序。'.h'扩展名用于C头文件 文件,因此传达了关于c++头文件的错误信息 文件。不使用扩展不能传达任何信息,还会迫使检查 确定文件内容的类型。明确使用“。hpp” 将其标识为c++头文件,并且在实际应用中工作良好。 (Rainer Deyke)
源文件的扩展名可能对您的构建系统有意义,例如,您可能在makefile中有一个用于.cpp或. C文件的规则,或者您的编译器(例如Microsoft cl.exe)可能根据扩展名将文件编译为C或c++。
因为您必须向#include指令提供整个文件名,所以头文件扩展名是不相关的。如果您愿意,您可以在另一个源文件中包含.c文件,因为它只是一个文本包含。你的编译器可能有一个选项来转储预处理输出,这将使这一点明确(微软:/P预处理到文件,/E预处理到stdout, /EP省略#line指令,/C保留注释)
你可以选择对那些只与c++环境相关的文件使用.hpp,也就是说,它们使用的特性不能用C编译。
幸运的是,这很简单。
如果您使用c++,您应该使用.hpp扩展名,并且您应该使用.h表示C或混合使用C和c++。
在Bjarne Stroustrup的《c++程序设计语言第三版》(第nº1本c++必读书籍)中,他使用了*.h。所以我认为最好的做法是使用*.h。
但是,*.hpp也很好!
在我90年代早期的一份工作中,我们分别使用.cc和.hh作为源文件和头文件。在所有的选择中,我仍然更喜欢它,可能是因为它最容易打字。