我的类定义一直使用*.h文件,但在阅读了一些boost库代码后,我意识到它们都使用*.hpp。我一直很讨厌这个文件扩展名,我想主要是因为我不习惯它。
使用*.hpp而不是*.h的优点和缺点是什么?
我的类定义一直使用*.h文件,但在阅读了一些boost库代码后,我意识到它们都使用*.hpp。我一直很讨厌这个文件扩展名,我想主要是因为我不习惯它。
使用*.hpp而不是*.h的优点和缺点是什么?
当前回答
下面是C和c++头文件命名不同的几个原因:
Automatic code formatting, you might have different guidelines for formatting C and C++ code. If the headers are separated by extension you can set your editor to apply the appropriate formatting automatically Naming, I've been on projects where there were libraries written in C and then wrappers had been implemented in C++. Since the headers usually had similar names, i.e. Feature.h vs Feature.hpp, they were easy to tell apart. Inclusion, maybe your project has more appropriate versions available written in C++ but you are using the C version (see above point). If headers are named after the language they are implemented in you can easily spot all the C-headers and check for C++ versions.
记住,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
and:
#ifndef MY_HEADER_H
#define MY_HEADER_H
void myCFunction() ;
#endif // MY_HEADER_H
源文件的扩展名可能对您的构建系统有意义,例如,您可能在makefile中有一个用于.cpp或. C文件的规则,或者您的编译器(例如Microsoft cl.exe)可能根据扩展名将文件编译为C或c++。
因为您必须向#include指令提供整个文件名,所以头文件扩展名是不相关的。如果您愿意,您可以在另一个源文件中包含.c文件,因为它只是一个文本包含。你的编译器可能有一个选项来转储预处理输出,这将使这一点明确(微软:/P预处理到文件,/E预处理到stdout, /EP省略#line指令,/C保留注释)
你可以选择对那些只与c++环境相关的文件使用.hpp,也就是说,它们使用的特性不能用C编译。
下面是C和c++头文件命名不同的几个原因:
Automatic code formatting, you might have different guidelines for formatting C and C++ code. If the headers are separated by extension you can set your editor to apply the appropriate formatting automatically Naming, I've been on projects where there were libraries written in C and then wrappers had been implemented in C++. Since the headers usually had similar names, i.e. Feature.h vs Feature.hpp, they were easy to tell apart. Inclusion, maybe your project has more appropriate versions available written in C++ but you are using the C version (see above point). If headers are named after the language they are implemented in you can easily spot all the C-headers and check for C++ versions.
记住,C不是c++,除非你知道你在做什么,否则混合和匹配是非常危险的。适当地命名源代码可以帮助您区分语言。
使用哪个扩展名并不重要。两种都可以。
我用*.h表示C,用*.hpp表示c++。
在我90年代早期的一份工作中,我们分别使用.cc和.hh作为源文件和头文件。在所有的选择中,我仍然更喜欢它,可能是因为它最容易打字。