สิ่งนี้ได้รับแจ้งจากคำตอบที่ฉันให้สำหรับคำถามปัจจุบันซึ่งถามเกี่ยวกับไลบรารี generics สำหรับ C - ผู้ถามระบุโดยเฉพาะว่าพวกเขาไม่ต้องการใช้ C ++
C เป็นภาษาโปรแกรมที่สมบูรณ์ C ไม่ใช่ส่วนย่อยของ C ++ โดยพลการ C ไม่ใช่ส่วนย่อยของ C ++ เลย
นี่คือ C ที่ถูกต้อง:
foo_t* foo = malloc ( sizeof(foo_t) );
เพื่อให้คอมไพล์เป็น C ++ คุณต้องเขียน:
foo_t* foo = static_cast<foo_t*>( malloc ( sizeof(foo_t) ) );
ซึ่งไม่ถูกต้อง C อีกต่อไป (คุณสามารถใช้แคสต์สไตล์ C ซึ่งในกรณีนี้มันจะคอมไพล์เป็น C แต่ถูกหลีกเลี่ยงโดยมาตรฐานการเข้ารหัส C ++ ส่วนใหญ่และโปรแกรมเมอร์ C หลายคนร่วมเป็นสักขีพยานในความคิดเห็น "don't cast malloc" ใน Stack Overflow) .
ไม่ใช่ภาษาเดียวกันและหากคุณมีโปรเจ็กต์อยู่ใน C คุณไม่ต้องการเขียนซ้ำในภาษาอื่นเพียงเพื่อใช้ไลบรารี คุณต้องการใช้ไลบรารีที่คุณสามารถเชื่อมต่อกับภาษาที่คุณใช้งานได้ (ในบางกรณีสิ่งนี้เป็นไปได้ด้วยextern "C"
ฟังก์ชั่น Wrapper บางอย่างขึ้นอยู่กับว่าเทมเพลต / อินไลน์ไลบรารี C ++ เป็นอย่างไร)
การใช้ไฟล์ C ตัวแรกในโปรเจ็กต์ที่ฉันกำลังทำนี่คือสิ่งที่จะเกิดขึ้นหากคุณเพียงแค่สลับgcc std=c99
สำหรับ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
ข้อผิดพลาดทั้งหมด 69 บรรทัดซึ่งสี่รายการเป็น Conversion ที่ไม่ถูกต้อง แต่ส่วนใหญ่เป็นคุณลักษณะที่มีอยู่ใน C99 แต่ไม่มีใน C ++
ไม่ใช่ว่าฉันใช้คุณสมบัติเหล่านั้นเพื่อความสนุก การโอนไปยังภาษาอื่นจะต้องใช้เวลามาก
ดังนั้นจึงเป็นเรื่องผิดที่จะแนะนำอย่างนั้น
[a] C คอมไพเลอร์เกือบจะเป็นคอมไพเลอร์ C ++ จริงๆดังนั้นจึงไม่มีผลกระทบด้านต้นทุนซอฟต์แวร์
มักจะมีผลกระทบด้านต้นทุนที่สำคัญในการย้ายรหัส C ที่มีอยู่ไปยังชุดย่อยขั้นตอนของ C ++
ดังนั้นการแนะนำให้'ใช้คลาส C ++ std :: que เป็นคำตอบสำหรับคำถามที่กำลังมองหาการใช้งานไลบรารีของคิวใน C นั้นหลังจากแนะนำ' ใช้วัตถุประสงค์ C ' และ' เรียกคลาส Java java.util.Queue โดยใช้ JNI 'หรือ'เรียกไลบรารี CPython' - จริงๆแล้ว Objective C เป็นชุดย่อยที่เหมาะสมของ C (รวมถึง C99) และไลบรารี Java และ CPython ทั้งสองสามารถเรียกใช้ได้โดยตรงจาก C โดยไม่ต้องพอร์ตรหัสที่ไม่เกี่ยวข้องกับภาษา C ++
แน่นอนคุณสามารถจัดหา C façadeให้กับไลบรารี C ++ ได้ แต่เมื่อคุณทำ C ++ แล้วก็ไม่ต่างจาก Java หรือ Python