GNU/Linux >> Belajar Linux >  >> Linux

Memanggil fungsi C dari kode C++

Kompilasi kode C seperti ini:

gcc -c -o somecode.o somecode.c

Kemudian kode C++ seperti ini:

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

Kemudian tautkan keduanya, dengan penghubung C++:

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

Anda juga harus memberi tahu kompiler C++ bahwa header C akan datang saat Anda menyertakan deklarasi untuk fungsi C. Jadi othercode.cpp dimulai dengan:

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

somecode.h harus berisi sesuatu seperti:

 #ifndef SOMECODE_H_
 #define SOMECODE_H_

 void foo();

 #endif

(Saya menggunakan gcc dalam contoh ini, tetapi prinsipnya sama untuk semua kompiler. Bangun secara terpisah sebagai C dan C++, lalu tautkan bersama.)

Biarkan saya mengumpulkan potongan-potongan dari jawaban dan komentar lain, untuk memberi Anda contoh dengan kode C dan C++ yang dipisahkan dengan rapi:

Bagian C:

foo.h :

#ifndef FOO_H
#define FOO_H

void foo(void);

#endif 

foo.c

#include "foo.h"

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

Kompilasi ini dengan gcc -c -o foo.o foo.c .

Bagian C++:

bar.cpp

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

void bar() {
  foo();
}

Kompilasi ini dengan g++ -c -o bar.o bar.cpp

Lalu tautkan semuanya:

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

Dasar Pemikiran: Kode C harus berupa kode C biasa, bukan #ifdef s untuk "mungkin suatu hari nanti saya akan menyebutnya dari bahasa lain". Jika beberapa pemrogram C++ memanggil fungsi C Anda, itu adalah mereka masalah bagaimana melakukan itu, bukan milikmu. Dan jika Anda adalah programmer C++, maka header C mungkin bukan milik Anda dan Anda tidak boleh mengubahnya, jadi penanganan nama fungsi yang tidak terurai (yaitu extern "C" ) termasuk dalam kode C++ Anda.

Anda mungkin, tentu saja, menulis sendiri header C++ kenyamanan yang tidak melakukan apa pun kecuali membungkus header C menjadi extern "C" deklarasi.


Linux
  1. Menjalankan Fungsi yang Ditentukan Pengguna Dalam Panggilan Find -exec?

  2. Apakah Rsync ~/foo Target/foo Sama Dengan Rsync ~/foo/ Target/foo/?

  3. Bagaimana Memanggil Fungsi Bash Dalam Skrip Bash Di Dalam Awk?

  1. Cara Membuat dan Memanggil Fungsi di Bash

  2. Cara Memanggil Fungsi C di C++, Fungsi C++ di C (Campuran C dan C++)

  3. Mengimpor modul Python dari Bash

  1. Menjalankan fungsi ruang pengguna dari ruang kernel

  2. Tidak dapat memanggil fungsi pustaka standar C pada Linux 64-bit dari kode rakitan (yasm).

  3. fungsi panggilan dinyatakan di bawah ini