J'utilise .hpp car je veux que l'utilisateur différencie les en-têtes de C++ des en-têtes de C.
Cela peut être important lorsque votre projet utilise à la fois des modules C et C++ : Comme quelqu'un l'a expliqué avant moi, vous devez le faire très soigneusement, et cela commence par le "contrat" que vous offrez grâce à l'extension
.hpp : En-têtes C++
(Ou .hxx, ou .hh, ou autre)
Cet en-tête est exclusivement pour C++.
Si vous êtes dans un module C, ne cherchez même pas à l'inclure. Vous n'aimerez pas cela, car aucun effort n'est fait pour le rendre compatible avec le C (trop de choses seraient perdues, comme la surcharge de fonctions, les espaces de noms, etc.)
.h : En-têtes C/C++ compatibles ou en-têtes C purs
Cet en-tête peut être inclus par à la fois par un code source C et un code source C++, directement ou indirectement.
Il peut être inclus directement, en étant protégé par le macro __cplusplus
:
- Ce qui signifie que, du point de vue du C++, le code compatible avec le C sera défini comme
extern "C"
.
- Du point de vue du C, tout le code en C sera clairement visible, mais le code en C++ sera caché (car il ne compilera pas dans un compilateur C).
Par exemple:
#ifndef MY_HEADER_H
#define MY_HEADER_H
#ifdef __cplusplus
extern "C"
{
#endif
void myCFunction() ;
#ifdef __cplusplus
} // extern "C"
#endif
#endif // MY_HEADER_H
Ou il pourrait être inclus indirectement par l'en-tête correspondant .hpp en l'encadrant avec la déclaration extern "C"
.
Par exemple:
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
extern "C"
{
#include "my_header.h"
}
#endif // MY_HEADER_HPP
et :
#ifndef MY_HEADER_H
#define MY_HEADER_H
void myCFunction() ;
#endif // MY_HEADER_H
2 votes
Pendant ce temps, il y a Les directives de base de C++ qui recommandent de manière non ambiguë *.h
3 votes
@Christophe Je ne dirais pas que la norme "de manière non équivoque" recommande *.h. Ils laissent la porte ouverte à la convention du projet :
SF.1: Utilisez un suffixe .cpp pour les fichiers de code et .h pour les fichiers d'interface si votre projet ne suit pas déjà une autre convention