Bu, C için bir jenerik kitaplığı soran güncel bir soruya verdiğim bir cevapla harekete geçirildi - soru soran özellikle C ++ kullanmak istemediklerini belirtiyor.
C tam bir programlama dilidir. C, C ++ 'ın rastgele bir alt kümesi değildir. C, C ++ 'nın bir alt kümesi değildir.
Bu geçerli C:
foo_t* foo = malloc ( sizeof(foo_t) );
C ++ olarak derlenmesi için şunu yazmanız gerekir:
foo_t* foo = static_cast<foo_t*>( malloc ( sizeof(foo_t) ) );
artık geçerli olmayan C. (C-style cast'ı kullanabilirsiniz, bu durumda C'de derlenir, ancak çoğu C ++ kodlama standardı ve ayrıca birçok C programcısı tarafından dışlanır; Stack Overflow'daki "malloc dökme" yorumlarına tanık olun) .
Aynı dil değildirler ve C'de mevcut bir projeniz varsa, sadece bir kütüphane kullanmak için onu farklı bir dilde yeniden yazmak istemezsiniz. Çalışmakta olduğunuz dilde arabirim oluşturabileceğiniz kitaplıkları kullanmayı tercih edersiniz. (Bazı durumlarda bu, extern "C"
şablonun / satır içi bir C ++ kitaplığının nasıl olduğuna bağlı olarak birkaç sarmalayıcı işleviyle mümkündür .)
Üzerinde çalıştığım bir projede ilk C dosyasını alarak, bu ne olur sadece takas eğer gcc std=c99
için 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
Dördü geçersiz dönüşüm, ancak çoğunlukla C99'da var olan ancak C ++ 'da olmayan özellikler için olmak üzere toplam 69 hata satırı.
Bu özellikleri eğlenmek için kullanmıyorum. Bunu farklı bir dile taşımak önemli bir çalışma gerektirir.
Bu yüzden bunu önermek kesinlikle yanlıştır
[a] C derleyicisi neredeyse kesinlikle bir C ++ derleyicisidir, bu nedenle yazılım maliyeti çıkarımları yoktur
Mevcut C kodunu C ++ 'ın yordamsal alt kümesine taşımanın genellikle önemli maliyet etkileri vardır.
Dolayısıyla , C'deki bir kuyruğun kitaplık uygulamasını arayan bir soruya yanıt olarak 'C ++ std :: queue sınıfını kullanın' önermesi, 'hedef C'yi kullan' ve 'JNI kullanarak Java java.util.Queue sınıfını çağırın ' önermekten daha iyidir. veya 'CPython kitaplığını çağırın' - Hedef C aslında C'nin uygun bir üst kümesidir (C99 dahil) ve Java ve CPython kitaplıklarının her ikisi de ilgisiz kodu C ++ diline taşımak zorunda kalmadan doğrudan C'den çağrılabilir.
Elbette, C ++ kitaplığına bir C cephesi sağlayabilirsiniz, ancak bunu bir kez yaptıktan sonra C ++, Java veya Python'dan farklı değildir.