GNU/Linux >> Znalost Linux >  >> Linux

Volání funkce C z kódu C++

Zkompilujte kód C takto:

gcc -c -o somecode.o somecode.c

Potom kód C++ takto:

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

Poté je propojte pomocí C++ linkeru:

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

Musíte také sdělit kompilátoru C++, že přichází hlavička C, když zahrnete deklaraci pro funkci C. Takže othercode.cpp začíná:

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

somecode.h by měl obsahovat něco jako:

 #ifndef SOMECODE_H_
 #define SOMECODE_H_

 void foo();

 #endif

(V tomto příkladu jsem použil gcc, ale princip je stejný pro jakýkoli kompilátor. Sestavte samostatně jako C a C++ a poté je propojte.)

Dovolte mi shromáždit kousky z ostatních odpovědí a komentářů, abych vám dal příklad s čistě odděleným kódem C a C++:

Část C:

foo.h :

#ifndef FOO_H
#define FOO_H

void foo(void);

#endif 

foo.c

#include "foo.h"

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

Zkompilujte to pomocí gcc -c -o foo.o foo.c .

Část C++:

bar.cpp

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

void bar() {
  foo();
}

Zkompilujte to pomocí g++ -c -o bar.o bar.cpp

A pak to všechno propojte:

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

Odůvodnění: Kód C by měl být prostý kód C, žádný #ifdef s pro "možná to někdy zavolám z jiného jazyka". Pokud nějaký C++ programátor volá vaše C funkce, je to jejich problém, jak to udělat, ne váš. A pokud jste programátor v C++, pak hlavička C nemusí být vaše a neměli byste ji měnit, takže zacházení s nezměněnými názvy funkcí (tj. extern "C" ) patří do vašeho kódu C++.

Můžete si samozřejmě napsat pohodlnou hlavičku C++, která nedělá nic jiného, ​​než zabalí hlavičku C do extern "C" prohlášení.


Linux
  1. Import modulu Python z Bash

  2. Jak implementovat časový limit ve volání funkce čtení?

  3. vytisknout zásobník volání v C nebo C++

  1. zápasí s c++ IDE na linuxu

  2. Nelze volat funkci standardní knihovny C na 64bitovém Linuxu z kódu sestavení (yasm).

  3. Jak odstraním kód VS a nastavení z Ubuntu?

  1. Volání nedefinované funkce simplexml_load_file() – chyba PHP [vyřešeno]

  2. Najděte počet řádků kódu z úložiště GitHub

  3. Provádění uživatelem definované funkce ve volání Find -exec?