Điều này được thúc đẩy bởi một câu trả lời mà tôi đã đưa ra cho một câu hỏi hiện tại hỏi về thư viện chung cho C - người hỏi đặc biệt nói rằng họ không muốn sử dụng C ++.
C là một ngôn ngữ lập trình hoàn chỉnh. C không phải là một tập con tùy ý của C ++. C hoàn toàn không phải là một tập con của C ++.
Đây là C hợp lệ:
foo_t* foo = malloc ( sizeof(foo_t) );
Để làm cho nó biên dịch dưới dạng C ++, bạn phải viết:
foo_t* foo = static_cast<foo_t*>( malloc ( sizeof(foo_t) ) );
mà không hợp lệ C nữa. (bạn có thể sử dụng kiểu ép kiểu C, nó sẽ biên dịch trong trường hợp nào bằng C, nhưng bị hầu hết các tiêu chuẩn mã hóa C ++ và nhiều lập trình viên C xa lánh; hãy chứng kiến nhận xét "không ép kiểu" trên Stack Overflow) .
Chúng không phải là cùng một ngôn ngữ, và nếu bạn có một dự án hiện có bằng C, bạn không muốn viết lại nó bằng một ngôn ngữ khác chỉ để sử dụng một thư viện. Bạn muốn sử dụng các thư viện mà bạn có thể giao tiếp bằng ngôn ngữ bạn đang làm việc. (Trong một số trường hợp, điều này có thể thực hiện được với một vài extern "C"
hàm trình bao bọc, tùy thuộc vào cách thức mẫu / nội tuyến của thư viện C ++.)
Lấy tệp C đầu tiên trong dự án mà tôi đang thực hiện, đây là điều sẽ xảy ra nếu bạn chỉ đổi gcc std=c99
lấy 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
Trong tổng số 69 dòng lỗi, bốn trong số đó là các chuyển đổi không hợp lệ, nhưng chủ yếu là đối với các tính năng tồn tại trong C99 nhưng không có trong C ++.
Nó không giống như tôi đang sử dụng những tính năng đó để giải trí. Sẽ mất nhiều công sức để chuyển nó sang một ngôn ngữ khác.
Vì vậy, rõ ràng là sai khi đề xuất rằng
[a] Trình biên dịch C gần như chắc chắn thực sự là trình biên dịch C ++, vì vậy không có tác động về chi phí phần mềm
Thường có những tác động chi phí đáng kể trong việc chuyển mã C hiện có sang tập con thủ tục của C ++.
Vì vậy, đề xuất 'sử dụng C ++ std :: queue class' như một câu trả lời cho câu hỏi tìm kiếm triển khai thư viện của một hàng đợi trong C sẽ nhẹ nhàng hơn so với đề xuất 'sử dụng mục tiêu C' và 'gọi lớp Java java.util.Queue bằng JNI' hoặc 'gọi thư viện CPython' - Mục tiêu C thực sự là một tập hợp chính xác của C (bao gồm C99), và các thư viện Java và CPython đều có thể gọi trực tiếp từ C mà không cần phải chuyển mã không liên quan sang ngôn ngữ C ++.
Tất nhiên bạn có thể cung cấp một mặt tiền C cho thư viện C ++, nhưng một khi bạn đang làm điều đó thì C ++ không khác gì Java hoặc Python.