Ini dipicu oleh jawaban yang saya berikan untuk pertanyaan saat ini yang menanyakan tentang pustaka generik untuk C - penanya secara khusus menyatakan bahwa mereka tidak ingin menggunakan C ++.
C adalah bahasa pemrograman yang lengkap. C bukanlah subset sembarang dari C ++. C sama sekali bukan bagian dari C ++.
Ini adalah C yang valid:
foo_t* foo = malloc ( sizeof(foo_t) );
Untuk membuatnya dikompilasi sebagai C ++ Anda harus menulis:
foo_t* foo = static_cast<foo_t*>( malloc ( sizeof(foo_t) ) );
yang tidak lagi valid C. (Anda dapat menggunakan cast gaya-C, yang akan dikompilasi dalam C, tetapi dijauhi oleh sebagian besar standar pengkodean C ++, dan juga oleh banyak programmer C; saksikan komentar "jangan cast malloc" di seluruh Stack Overflow) .
Mereka bukan bahasa yang sama, dan jika Anda memiliki proyek yang sudah ada di C, Anda tidak ingin menulis ulang dalam bahasa yang berbeda hanya untuk menggunakan perpustakaan. Anda lebih suka menggunakan pustaka yang dapat Anda gunakan untuk antarmuka dalam bahasa yang Anda gunakan. (Dalam beberapa kasus hal ini dimungkinkan dengan beberapa extern "C"
fungsi pembungkus, bergantung pada bagaimana template / sebaris pustaka C ++.)
Mengambil file C pertama dalam proyek saya kerjakan, ini adalah apa yang terjadi jika Anda hanya pertukaran gcc std=c99
untuk g++
:
sandiego:$ g++ -g -O1 -pedantic -mfpmath=sse -DUSE_SSE2 -DUSE_XMM3 -I src/core -L /usr/lib -DARCH=elf64 -D_BSD_SOURCE -DPOSIX -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112L -Wall -Wextra -Wwrite-strings -Wredundant-decls -Werror -Isrc src/core/kin_object.c -c -o obj/kin_object.o | wc -l
In file included from src/core/kin_object.c:22:
src/core/kin_object.h:791:28: error: anonymous variadic macros were introduced in C99
In file included from src/core/kin_object.c:26:
src/core/kin_log.h:42:42: error: anonymous variadic macros were introduced in C99
src/core/kin_log.h:94:29: error: anonymous variadic macros were introduced in C99
...
cc1plus: warnings being treated as errors
src/core/kin_object.c:101: error: ISO C++ does not support the ‘z’ printf length modifier
..
src/core/kin_object.c:160: error: invalid conversion from ‘void*’ to ‘kin_object_t*’
..
src/core/kin_object.c:227: error: unused parameter ‘restrict’
..
src/core/kin_object.c:271: error: ISO C++ does not support the ‘z’ printf length modifier
src/core/kin_object.c:271: error: ISO C++ does not support the ‘z’ printf length modifier
Total 69 baris kesalahan, empat di antaranya merupakan konversi tidak valid, tetapi sebagian besar untuk fitur yang ada di C99 tetapi tidak di C ++.
Ini tidak seperti saya menggunakan fitur-fitur itu untuk bersenang-senang. Ini akan membutuhkan pekerjaan yang signifikan untuk memindahkannya ke bahasa lain.
Jadi sangatlah salah untuk menyarankan itu
[a] Kompiler C hampir pasti merupakan kompilator C ++, jadi tidak ada implikasi biaya perangkat lunak
Seringkali ada implikasi biaya yang signifikan dalam mem-porting kode C yang ada ke subset prosedural C ++.
Jadi menyarankan 'menggunakan C ++ std :: queue class' sebagai jawaban untuk pertanyaan mencari implementasi perpustakaan dari antrian di C lebih baik daripada menyarankan 'gunakan tujuan C' dan 'panggil kelas java.util.Queue Java menggunakan JNI' atau 'panggil pustaka CPython' - Sasaran C sebenarnya adalah superset yang tepat dari C (termasuk C99), dan pustaka Java dan CPython keduanya dapat dipanggil langsung dari C tanpa harus mem-port kode yang tidak terkait ke bahasa C ++.
Tentu saja Anda dapat menyediakan façade C ke pustaka C ++, tetapi setelah Anda melakukannya, C ++ tidak berbeda dengan Java atau Python.