Juste une petite question: C++ peut-il utiliser des fichiers d'en-tête C dans un programme?
Cela pourrait être une question étrange, fondamentalement, j'ai besoin d'utiliser le code source d'un autre programme (fabriqué en langage C) dans un programme C++. Y a-t-il une différence entre les deux fichiers d'en-tête en général? Peut-être que si je change certaines bibliothèques ... j'espère que vous pourrez m'aider.
Oui, vous pouvez inclure des en-têtes C dans le code C++. Il est normal d'ajouter ceci:
#ifdef __cplusplus
extern "C"
{
#endif
// C header here
#ifdef __cplusplus
}
#endif
de sorte que le compilateur C++ sache que les déclarations de fonctions, etc. doivent être traitées en C et non en C++.
Si vous compilez le code C ensemble, dans le cadre de votre projet, avec votre code C++, vous devez simplement inclure les fichiers d'en-tête comme d'habitude et utiliser le mode de compilation C++ pour compiler le code - cependant, du code C a gagné ne compilez pas "proprement" avec un compilateur C++ (par exemple, l'utilisation de malloc
nécessitera une conversion).
Si, d'autre part, vous avez une bibliothèque ou un autre code qui ne fait pas partie de votre projet, vous devez vous assurer que les en-têtes sont marqués comme extern "C"
, sinon la convention de dénomination C++ pour les noms de fonctions compilés s'appliquera, ce qui ne correspondra pas à la convention de dénomination utilisée par le compilateur C.
Il y a deux options ici, soit vous modifiez le fichier d'en-tête lui-même, en ajoutant
#ifdef __cplusplus
extern "C" {
#endif
... original content of headerfile goes here.
#ifdef __cplusplus
}
#endif
Ou, si vous n'avez pas la possibilité de modifier ces en-têtes, vous pouvez utiliser ce formulaire:
#ifdef __cplusplus
extern "C" {
#endif
#include <c_header.h>
#ifdef __cplusplus
}
#endif
Oui, mais vous devez indiquer au compilateur C++ que les déclarations de l'en-tête sont C:
extern "C" {
#include "c-header.h"
}
De nombreux en-têtes C les ont déjà inclus, enveloppés dans #if defined __cplusplus
. C'est sans doute un peu bizarre (syntaxe C++ dans un en-tête C) mais c'est souvent fait pour plus de commodité.