当前位置:  开发笔记 > 编程语言 > 正文

*.h或*.hpp用于您的类定义

如何解决《*.h或*.hpp用于您的类定义》经验,为你挑选了13个好方法。

我总是使用一个*.h文件作为我的类定义,但在阅读了一些boost库代码后,我意识到它们都在使用*.hpp.我一直厌恶那个文件扩展名,我想主要是因为我不习惯它.

使用*.hpp过的优点和缺点是*.h什么?



1> David Holm..:

以下是使用C和C++标头的不同命名的几个原因:

自动代码格式化,您可能有不同的格式化C和C++代码的准则.如果标题是通过扩展名分隔的,则可以将编辑器设置为自动应用适当的格式

命名,我一直在项目中,用C语言编写库,然后用C++实现包装器.由于标题通常具有相似的名称,即Feature.h与Feature.hpp,因此很容易区分.

包含,也许你的项目有更合适的版本可用C++编写,但你使用的是C版本(见上文).如果标头以它们实现的语言命名,您可以轻松找到所有C标头并检查C++版本.

请记住,C 不是 C++,除非你知道自己在做什么,否则混合和匹配会非常危险.适当地命名您的来源可以帮助您区分语言.



2> paercebal..:

我使用.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



@GeofSawaya:不,对不起.这是一种习惯.在撰写文章时,我使用大写的扩展来区分文件的类型,如".HPP文件".但是我硬盘上的实际文件的扩展名总是小写的,即使名称不是,如"MyClass.hpp"或"module.hpp"
@einpoklum:当然.但我尽量避免"猴子看猴子行为"的行为.在目前的情况下,两个扩展(和其他)都可用,所以我试着让它们实际计数.与客户共享的代码签订此合同非常有用:每个人(即数百名开发人员)都知道客户端使用C编译器会使用".H"文件,所以不会错误地认为可以在那里或不.每个人(包括客户)都知道".HPP"文件永远不会尝试C友好.每个人都赢了.
@paercebal,所以你建议**.H**而不是**.h**和**.HPP**超过**.hpp**?
谢谢,@ paercebal.我变得迂腐了
在许多C ++项目中,这是非常不习惯的。.h文件用于处理非常规的内容。

3> Perculator..:

我一直认为.hpp标题是一种portmanteau .h.cpp文件......一个包含实现细节的标题.

通常,当我看到(并使用).hpp作为扩展时,没有相应的.cpp文件.正如其他人所说,这不是一个硬性规则,而是我倾向于使用.hpp文件的方式.



4> Burkhard..:

您使用哪种扩展名无关紧要.任何一个都可以.

*.h用于C和*.hppC++.



5> ProgramCpp..:

编辑 [Dan Nissenbaum补充说明]:

根据一种惯例,当在标题本身中定义原型时使用.hpp文件.标头中的此类定义在模板的情况下很有用,因为编译器仅在模板实例化时为每种类型生成代码.因此,如果它们未在头文件中定义,则它们的定义将不会在链接时从其他编译单元解析.如果您的项目是仅使用C++的项目,那么该约定可能会很有用.

某些符合此约定的模板库提供带有.hpp扩展名的标头,以指示它们没有相应的.cpp文件.

其他一些模板库使用另一种约定,比如使用.h作为C头,使用.hpp作为C++; 一个很好的例子是boost库.

来自Boost FAQ的报价,

文件扩展名将文件的"类型"传达给人类和计算机程序.'.h'扩展名用于C头文件,因此传达了有关C++头文件的错误信息.使用no扩展名不会传递任何内容并强制检查文件内容以确定类型.使用'.hpp'可以明确地将其标识为C++头文件,并且在实际操作中运行良好.(Rainer Deyke)


我认为这个答案是有用的,除了它缺少一个非常简单但重要的短语:"按惯例,而不是语言规则"(某处).

6> Serge..:

我最近开始使用*.hppc ++标头.

原因是我使用emacs作为我的主编辑器,当你加载*.h文件时它会自动进入c模式,当你加载文件时它会进入c ++模式*.hpp.

除了这个事实,我认为没有充分的理由选择*.h,*.hpp反之亦然.


就个人而言,我认为C++突出显示即使在C头中也是一个好主意.我一直处于有人想要从C++中包含C头的情况的两端,但它使用C++关键字作为参数名称...

7> dhein..:

我正在回答这个提醒,指出我对"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 当然,我不能说未来的版本会带来什么!



8> slashmais..:

你可以随意打电话给你的包.

只需要在中指定全名#include.

我建议如果你使用C来使用.h和使用C++时.hpp.

它最终只是一个惯例.



9> JohnMcG..:

我更喜欢.hpp for C++让编辑器和其他程序员都清楚它是C++头而不是C头文件.



10> Dynite..:

C++("C Plus Plus")作为.cpp有意义

具有.hpp扩展名的头文件不具有相同的逻辑流.


同意; "标头加上加号"并没有完全成功.

11> Roddy..:

Codegear C++ Builder将.hpp用于从Delphi源文件自动生成的头文件,以及.h文件用于"自己的"头文件.

所以,当我写一个C++头文件时,我总是使用.h.



12> camh..:

在我90年代早期的一个工作中,我们分别使用.cc和.hh作为源文件和头文件.我仍然喜欢它的所有替代方案,可能是因为它最容易打字.



13> 小智..:

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。

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有