我总是使用一个*.h
文件作为我的类定义,但在阅读了一些boost库代码后,我意识到它们都在使用*.hpp
.我一直厌恶那个文件扩展名,我想主要是因为我不习惯它.
使用*.hpp
过的优点和缺点是*.h
什么?
以下是使用C和C++标头的不同命名的几个原因:
自动代码格式化,您可能有不同的格式化C和C++代码的准则.如果标题是通过扩展名分隔的,则可以将编辑器设置为自动应用适当的格式
命名,我一直在项目中,用C语言编写库,然后用C++实现包装器.由于标题通常具有相似的名称,即Feature.h与Feature.hpp,因此很容易区分.
包含,也许你的项目有更合适的版本可用C++编写,但你使用的是C版本(见上文).如果标头以它们实现的语言命名,您可以轻松找到所有C标头并检查C++版本.
请记住,C 不是 C++,除非你知道自己在做什么,否则混合和匹配会非常危险.适当地命名您的来源可以帮助您区分语言.
我使用.hpp是因为我希望用户区分哪些标头是C++标头,哪些标头是C标头.
当您的项目同时使用C和C++模块时,这可能很重要:像我之前解释的其他人一样,您应该非常小心地完成它,并且它通过您通过扩展提供的"合同"开始
.hpp:C++标题(或.hxx,或.hh,或其他)
此标头仅适用于C++.
如果你在C模块中,甚至不要尝试包含它.你不会喜欢它,因为没有做任何努力使它对C友好(太多会丢失,如函数重载,命名空间等等).
.h:C/C++兼容或纯C标头此标头可以直接或间接地包含在C源和C++源中.
它可以直接包含,受__cplusplus
宏保护:
这意味着,从C++的角度来看,C兼容代码将被定义为extern "C"
.
从C的角度来看,所有C代码都是明显可见的,但C++代码将被隐藏(因为它不会在C编译器中编译).
例如:
#ifndef MY_HEADER_H #define MY_HEADER_H #ifdef __cplusplus extern "C" { #endif void myCFunction() ; #ifdef __cplusplus } // extern "C" #endif #endif // MY_HEADER_H
或者可以通过相应的.hpp标头间接包含它,并将其与extern "C"
声明一起包含在内.
例如:
#ifndef MY_HEADER_HPP #define MY_HEADER_HPP extern "C" { #include "my_header.h" } #endif // MY_HEADER_HPP
和:
#ifndef MY_HEADER_H #define MY_HEADER_H void myCFunction() ; #endif // MY_HEADER_H
我一直认为.hpp
标题是一种portmanteau .h
和.cpp
文件......一个包含实现细节的标题.
通常,当我看到(并使用).hpp
作为扩展时,没有相应的.cpp
文件.正如其他人所说,这不是一个硬性规则,而是我倾向于使用.hpp
文件的方式.
您使用哪种扩展名无关紧要.任何一个都可以.
我*.h
用于C和*.hpp
C++.
编辑 [Dan Nissenbaum补充说明]:
根据一种惯例,当在标题本身中定义原型时使用.hpp文件.标头中的此类定义在模板的情况下很有用,因为编译器仅在模板实例化时为每种类型生成代码.因此,如果它们未在头文件中定义,则它们的定义将不会在链接时从其他编译单元解析.如果您的项目是仅使用C++的项目,那么该约定可能会很有用.
某些符合此约定的模板库提供带有.hpp扩展名的标头,以指示它们没有相应的.cpp文件.
其他一些模板库使用另一种约定,比如使用.h作为C头,使用.hpp作为C++; 一个很好的例子是boost库.
来自Boost FAQ的报价,
文件扩展名将文件的"类型"传达给人类和计算机程序.'.h'扩展名用于C头文件,因此传达了有关C++头文件的错误信息.使用no扩展名不会传递任何内容并强制检查文件内容以确定类型.使用'.hpp'可以明确地将其标识为C++头文件,并且在实际操作中运行良好.(Rainer Deyke)
我最近开始使用*.hpp
c ++标头.
原因是我使用emacs作为我的主编辑器,当你加载*.h
文件时它会自动进入c模式,当你加载文件时它会进入c ++模式*.hpp
.
除了这个事实,我认为没有充分的理由选择*.h
,*.hpp
反之亦然.
我正在回答这个提醒,指出我对"user1949346"对这个OP的回答的评论.
因此,许多人已经回答:两种方式都没问题.其次是强调自己的印象.
介绍,正如之前提到的评论中所述,我的观点是如果实际上没有理由反对它,C++
则建议使用标题扩展.h
.
由于ISO/IEC文档使用头文件的这种表示法,并且.hpp
在他们的语言文档中甚至没有字符串匹配C++
.
但是我现在的目标是一个可以接受的理由为什么两种方式都可以,特别是为什么它不是自己的语言主题.
所以我们走了.
该C++
文件(实际上,我正在从版本N3690参考)定义了一个头必须符合以下语法:
2.9标题名称
header-name: < h-char-sequence > " q-char-sequence " h-char-sequence: h-char h-char-sequence h-char h-char: any member of the source character set except new-line and > q-char-sequence: q-char q-char-sequence q-char q-char: any member of the source character set except new-line and "
因此,我们可以从这部分中提取,头文件名也可以是在源代码中有效的任何内容.除了包含'\n'
字符和取决于是否包含字符外,<>
不允许包含字符>
.或者另一种方式,如果它包含在""
-include中,则不允许包含a "
.
换句话说:如果你有一个支持文件名的环境prettyStupidIdea.>
,比如:
#include "prettyStupidIdea.>"
是有效的,但是:
#include>
会无效的.另一种方式是相同的.
乃至
#include <<.<>
将是一个有效的包含头文件名.
即便如此C++
,这也是一个相当愚蠢的想法.
这.hpp
也是有效的原因.
但这不是委员会为语言设计决策的结果!
所以讨论即将使用.hpp
与执行相同.cc
,.mm
或者我在其他帖子中读到的关于此主题的内容.
我不得不承认,我不知道哪里.hpp
是从哪里来1,但我敢打赌,一些分析工具,IDE或别的什么关心的发明者C++
来到这个想法,以优化一些内部流程,或者只是即使他们不一定发明一些(可能)新的命名约定.
但它不是语言的一部分.
每当有人决定以这种方式使用它时.可能是因为他最喜欢它,或者因为工作流程的某些应用程序需要它,所以从来没有2是语言的要求.所以无论谁说"pp是因为它与C++一起使用",在语言定义方面都是错误的.
C++允许任何与前一段相关的内容.如果委员会建议使用任何内容,那么它正在使用,.h
因为这是ISO文档的所有示例中的扩展.
结论:
只要你没有看到/感觉到任何需要使用.h
过.hpp
或相反,你应该不打扰.因为两者都将形成与标准相同质量的有效标题名称.因此,任何需要您使用的内容.h
或者.hpp
是对标准的额外限制,甚至可能与其他附加限制相矛盾.但由于OP没有提及任何其他语言限制,这是该问题唯一正确和可批准的答案
" *.h或*.hpp为您的类定义 "是:
只要不存在外部限制,两者都同样正确且适用.
1据我所知,显然,它是推出该.hpp
扩展的提升框架.
2 当然,我不能说未来的版本会带来什么!
你可以随意打电话给你的包.
只需要在中指定全名#include
.
我建议如果你使用C来使用.h
和使用C++时.hpp
.
它最终只是一个惯例.
我更喜欢.hpp for C++让编辑器和其他程序员都清楚它是C++头而不是C头文件.
C++("C Plus Plus")作为.cpp有意义
具有.hpp扩展名的头文件不具有相同的逻辑流.
Codegear C++ Builder将.hpp用于从Delphi源文件自动生成的头文件,以及.h文件用于"自己的"头文件.
所以,当我写一个C++头文件时,我总是使用.h.
在我90年代早期的一个工作中,我们分别使用.cc和.hh作为源文件和头文件.我仍然喜欢它的所有替代方案,可能是因为它最容易打字.
Bjarne Stroustrup和Herb Sutter在其C ++核心准则中对此问题做了陈述,网址为:https : //github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-source,它也参考了最新的更改在标准扩展名(C ++ 11,C ++ 14等)中
SF.1:如果您的Y项目尚未遵循其他约定,则对代码文件使用.cpp后缀,对于接口文件使用.h。
这是一个长期的惯例。但是一致性更重要,因此,如果您的项目使用其他内容,请遵循该原则。注意
该约定反映了一种常见的使用模式:标头通常与C共享,以作为C ++和C进行编译,通常都使用.h,并且更容易将所有标头命名为.h,而不是仅对想要的标头使用不同的扩展名另一方面,实现文件很少与C共享,因此通常应与.c文件区分开,因此通常最好将所有C ++实现文件命名为其他名称(例如.cpp)。
不需要特定的名称.h和.cpp(建议将其作为默认名称),其他名称也得到了广泛使用。例如.hh,.C和.cxx。等效使用此类名称。在本文档中,即使实际扩展名可能不同,我们也将.h和.cpp>用作头文件和实现文件的简写。
您的IDE(如果使用的话)可能对满足要求有强烈的意见。
我不是这个约定的忠实拥护者,因为如果您使用的是诸如boost这样的流行库,则您的一致性已被破坏,您最好使用.hpp。