Saya sedang mengerjakan proyek yang memiliki banyak kode C sebelumnya . Kami sudah mulai menulis dalam C ++, dengan tujuan untuk akhirnya mengonversi kode lama juga. Saya agak bingung tentang bagaimana C dan C ++ berinteraksi. Saya mengerti bahwa dengan membungkus kode C dengan extern "C"
kompiler C ++ tidak akan memotong-motong nama kode C , tapi saya tidak sepenuhnya yakin bagaimana menerapkannya.
Jadi, di bagian atas setiap file header C (setelah penjaga termasuk), kita miliki
#ifdef __cplusplus
extern "C" {
#endif
dan di bagian bawah, kita menulis
#ifdef __cplusplus
}
#endif
Di antara keduanya, kami memiliki semua prototipe fungsi, typedef, dan fungsi kami. Saya punya beberapa pertanyaan, untuk melihat apakah saya memahami ini dengan benar:
Jika saya memiliki file C ++ A.hh yang mencakup file header C Bh, termasuk file header C lain Ch, bagaimana cara kerjanya? Saya pikir ketika kompiler melangkah ke Bh,
__cplusplus
akan ditentukan, sehingga akan membungkus kode denganextern "C"
(dan__cplusplus
tidak akan didefinisikan di dalam blok ini). Jadi, ketika melangkah ke Ch,__cplusplus
tidak akan ditentukan dan kode tidak akan dibungkusextern "C"
. Apakah ini benar?Apakah ada yang salah dengan membungkus sepotong kode
extern "C" { extern "C" { .. } }
? Apa yang akanextern "C"
dilakukan yang kedua ?Kami tidak meletakkan pembungkus ini di sekitar file .c, hanya file .h. Jadi, apa yang terjadi jika suatu fungsi tidak memiliki prototipe? Apakah kompiler berpikir bahwa itu adalah fungsi C ++?
Kami juga menggunakan beberapa kode pihak ketiga yang ditulis dalam C , dan tidak memiliki pembungkus semacam ini di sekitarnya. Setiap kali saya memasukkan tajuk dari perpustakaan itu, saya telah meletakkan di
extern "C"
sekitar #include. Apakah ini cara yang tepat untuk menghadapinya?Akhirnya, apakah ini merupakan ide bagus? Apakah ada hal lain yang harus kita lakukan? Kita akan mencampur C dan C ++ untuk masa yang akan datang, dan saya ingin memastikan bahwa kami mencakup semua basis kami.