这是由我给一个当前问题的答案,它询问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样式的CAST,它将在C中编译,但大多数C++编码标准都会回避,也会被许多C程序员所忽略;在堆栈溢出时,请注意"不投Malc"注释.
它们不是同一种语言,如果你有一个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行错误,其中四个是无效转换,但大部分是针对C99中存在的特征,而不是C++中的.
我并不是为了好玩才使用这些功能的.将其移植到另一种语言将需要大量的工作.
因此,这种说法显然是错误的
[a]编译器几乎肯定是C++编译器,因此没有软件成本的含义.
在将现有C代码移植到C++的过程子集时,常常会产生显著的成本影响.
因此,建议'use the C++ std::queue class'作为对C中的队列实现库的问题的答案是DSED,而不是建议'use objective C'和'call the Java java.util.Queue class using JNI'或'call the CPython library' -目标C实际上是C++的一个适当的超集(包括C99),java和cPython库都可以直接从C调用,而不必将无关代码移植到C++语言.
当然,您可以向C++库提供C FAXADE,但是一旦您这样做,C++与java或Python就没有什么不同.