web-dev-qa-db-fra.com

Comment utiliser le code C en C ++

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.

27
SadSeven

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++.

38
RichieHindle

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
14
Mats Petersson

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é.

8
unwind