GNU/Linux >> Tutoriels Linux >  >> Linux

Appeler une fonction C à partir du code C++

Compilez le code C comme ceci :

gcc -c -o somecode.o somecode.c

Puis le code C++ comme ceci :

g++ -c -o othercode.o othercode.cpp

Ensuite, reliez-les ensemble, avec l'éditeur de liens C++ :

g++ -o yourprogram somecode.o othercode.o

Vous devez également indiquer au compilateur C++ qu'un en-tête C arrive lorsque vous incluez la déclaration de la fonction C. Donc othercode.cpp commence par :

extern "C" {
#include "somecode.h"
}

somecode.h doit contenir quelque chose comme :

 #ifndef SOMECODE_H_
 #define SOMECODE_H_

 void foo();

 #endif

(J'ai utilisé gcc dans cet exemple, mais le principe est le même pour n'importe quel compilateur. Construisez séparément en tant que C et C++, respectivement, puis liez-le ensemble.)

Permettez-moi de rassembler les éléments des autres réponses et commentaires, pour vous donner un exemple avec du code C et C++ proprement séparé :

La partie C :

foo.h :

#ifndef FOO_H
#define FOO_H

void foo(void);

#endif 

foo.c

#include "foo.h"

void foo(void)
{
    /* ... */
}

Compilez ceci avec gcc -c -o foo.o foo.c .

La partie C++ :

bar.cpp

extern "C" {
  #include "foo.h" //a C header, so wrap it in extern "C" 
}

void bar() {
  foo();
}

Compilez ceci avec g++ -c -o bar.o bar.cpp

Et puis reliez le tout :

g++ -o myfoobar foo.o bar.o

Justification : Le code C doit être du code C clair, pas de #ifdef s pour "peut-être qu'un jour j'appellerai ça depuis une autre langue". Si un programmeur C++ appelle vos fonctions C, c'est leur problème comment faire cela, pas le vôtre. Et si vous êtes le programmeur C++, alors l'en-tête C n'est peut-être pas le vôtre et vous ne devriez pas le changer, donc la gestion des noms de fonction non mutilés (c'est-à-dire le extern "C" ) appartient à votre code C++.

Vous pouvez, bien sûr, écrire vous-même un en-tête C++ pratique qui ne fait rien d'autre que d'envelopper l'en-tête C dans un extern "C" déclaration.


Linux
  1. imprimer la pile d'appels en C ou C++

  2. aux prises avec les IDE c++ sous Linux

  3. Appeler une fonction de l'espace utilisateur à partir d'un module du noyau Linux

  4. Impossible d'appeler la fonction de bibliothèque standard C sur Linux 64 bits à partir du code d'assemblage (yasm)

  5. fonction d'appel déclarée ci-dessous

Principes de base de la compilation de logiciels à partir du code source sous Linux

Trouver le nombre de lignes de code à partir du référentiel GitHub

Appeler Notify-send à partir d'une règle Udev ?

Est-ce que Rsync ~/foo Target/foo est identique à Rsync ~/foo/ Target/foo/?

Comment créer et appeler des fonctions dans Bash

Comment puis-je profiler du code C++ exécuté sous Linux ?