이것은 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 프로그래머에 의해 피할 수 있습니다. 스택 오버플로 전체에서 "malloc을 캐스팅하지 마십시오"주석을 확인하십시오) .
그들은 같은 언어가 아니며 C로 기존 프로젝트가있는 경우 라이브러리를 사용하기 위해 다른 언어로 다시 작성하고 싶지 않습니다. 작업중인 언어로 인터페이스 할 수있는 라이브러리를 사용하는 것이 좋습니다. (어떤 경우 extern "C"
에는 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 줄의 오류 중 4 개는 유효하지 않은 변환이지만 대부분 C99에는 있지만 C ++에는없는 기능에 대한 것입니다.
재미를 위해 이러한 기능을 사용하는 것과는 다릅니다. 다른 언어로 이식하려면 상당한 작업이 필요합니다.
따라서 다음과 같이 제안하는 것은 잘못된 것입니다.
[a] C 컴파일러는 거의 확실하게 C ++ 컴파일러이므로 소프트웨어 비용에 영향을주지 않습니다.
기존 C 코드를 C ++의 절차 적 하위 집합으로 이식하는 데 상당한 비용 문제가 발생하는 경우가 많습니다.
따라서 C에서 큐 의 라이브러리 구현을 찾는 질문에 대한 대답으로 'C ++ std :: queue 클래스 사용' 을 제안하는 것은 '목표 C 사용' 및 'JNI를 사용하여 Java java.util.Queue 클래스 호출 '을 제안하는 것보다 더 후회입니다. 또는 'CPython 라이브러리 호출'-Objective C는 실제로 C (C99 포함)의 적절한 상위 집합이며 Java 및 CPython 라이브러리는 모두 관련없는 코드를 C ++ 언어로 이식 할 필요없이 C에서 직접 호출 할 수 있습니다.
물론 C ++ 라이브러리에 C façade를 제공 할 수 있지만 일단 그렇게하면 C ++는 Java 또는 Python과 다르지 않습니다.