Jawaban ini diinspirasi oleh kasus di mana alasan Arne benar. Vendor menulis pustaka yang pernah mendukung C dan C ++; namun, versi terbaru hanya mendukung C. Arahan sisa berikut yang tersisa di kode menyesatkan:
#ifdef __cplusplus
extern "C" {
#endif
Ini menghabiskan waktu beberapa jam untuk mencoba mengkompilasi dalam C ++. Cukup menelepon C dari C ++ jauh lebih mudah.
Konvensi ifdef __cplusplus melanggar prinsip tanggung jawab tunggal. Kode yang menggunakan konvensi ini mencoba melakukan dua hal sekaligus:
- (1) menjalankan fungsi di C - dan -
- (2) jalankan fungsi yang sama di C ++
Ini seperti mencoba menulis dalam bahasa Inggris Amerika dan Inggris pada saat yang bersamaan. Ini tidak perlu membuang kunci pas #ifdef __thequeensenglish #elif __yankeeenglish wrench #else alat yang tidak berguna yang membuat kode lebih sulit dibaca #endif ke dalam kode.
Untuk kode sederhana dan pustaka kecil, konvensi ifdef __cplusplus dapat berfungsi; Namun, untuk perpustakaan yang kompleks, yang terbaik adalah memilih satu bahasa atau yang lain dan tetap menggunakannya. Mendukung salah satu bahasa akan membutuhkan lebih sedikit perawatan daripada mencoba mendukung keduanya.
Ini adalah catatan modifikasi yang saya buat pada kode Arne agar dapat dikompilasi di Ubuntu Linux.
foo.h :
#ifndef FOO_H
#define FOO_H
void foo(void);
#endif
foo.c
#include "foo.h"
#include <stdio.h>
void foo(void)
{
printf("This Hello World was called in C++ and written in C\n");
}
bar.cpp
extern "C" {
#include "foo.h"
}
int main() {
foo();
return(0);
}
Makefile
myfoobar: bar.o foo.o
g++ -o myfoobar foo.o bar.o
bar.o: bar.cpp
g++ -c -o bar.o bar.cpp
foo.o: foo.c
gcc -c -o foo.o foo.c
g++
pesan kesalahan