GNU/Linux >> Linux Esercitazione >  >> Linux

Chiama una funzione C dal codice C++

Compila il codice C in questo modo:

gcc -c -o somecode.o somecode.c

Poi il codice C++ come questo:

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

Quindi collegali insieme, con il linker C++:

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

Devi anche dire al compilatore C++ che sta arrivando un'intestazione C quando includi la dichiarazione per la funzione C. Quindi othercode.cpp inizia con:

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

somecode.h dovrebbe contenere qualcosa come:

 #ifndef SOMECODE_H_
 #define SOMECODE_H_

 void foo();

 #endif

(Ho usato gcc in questo esempio, ma il principio è lo stesso per qualsiasi compilatore. Compila separatamente come C e C++, rispettivamente, quindi collegalo insieme.)

Consentitemi di raccogliere i frammenti dalle altre risposte e commenti, per darvi un esempio con codice C e C++ nettamente separati:

La parte C:

foo.h :

#ifndef FOO_H
#define FOO_H

void foo(void);

#endif 

foo.c

#include "foo.h"

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

Compilalo con gcc -c -o foo.o foo.c .

La parte C++:

bar.cpp

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

void bar() {
  foo();
}

Compilalo con g++ -c -o bar.o bar.cpp

E poi collega tutto insieme:

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

Motivazione: Il codice C dovrebbe essere semplice codice C, senza #ifdef s per "forse un giorno lo chiamerò da un'altra lingua". Se qualche programmatore C++ chiama le tue funzioni C, è loro problema come farlo, non il tuo. E se sei il programmatore C++, allora l'intestazione C potrebbe non essere tua e non dovresti cambiarla, quindi la gestione dei nomi di funzione non modificati (cioè il extern "C" ) appartiene al tuo codice C++.

Potresti, ovviamente, scrivere tu stesso un comodo header C++ che non fa altro che avvolgere l'header C in un extern "C" dichiarazione.


Linux
  1. Come chiamare una funzione Bash nello script Bash all'interno di Awk?

  2. Come creare e chiamare funzioni in Bash

  3. Importazione del modulo Python da Bash

  4. Come implementare un timeout nella chiamata alla funzione di lettura?

  5. stampa stack di chiamate in C o C++

Nozioni di base sulla compilazione di software dal codice sorgente in Linux

Chiama notifica-invia da una regola Udev?

Come chiamare la funzione C in C++, la funzione C++ in C (mix di C e C++)

Come posso profilare il codice C++ in esecuzione su Linux?

Esecuzione di una funzione dello spazio utente dallo spazio del kernel

Come rimuovo VS Code e impostazioni da Ubuntu?