This is prompted by a an answer I gave to a current question which asks about a generics library for C – the questioner specifically states that they do not want to use C++.
C是一种完整的编程语言. C不是C的任意子集. C根本不是C的子集.
这是有效的C:
foo_t* foo = malloc ( sizeof(foo_t) );
要使其编译为C,您必须编写:
foo_t* foo = static_cast( malloc ( sizeof(foo_t) ) );
这不再是有效的C. (你可以使用C风格的强制转换,它在C中编译的情况,但是大多数C编码标准,以及许多C程序员都避开了;见证了“不要在整个Stack Overflow上发布malloc”的评论) .
它们不是同一种语言,如果你在C中有一个现有的项目,你不想用另一种语言重写它只是为了使用一个库.您更愿意使用可以使用您正在使用的语言进行交互的库.(在某些情况下,可以使用一些extern“C”包装函数,具体取决于C库的模板/内联方式.)
在我正在研究的项目中获取第一个C文件,如果您只是为g替换gcc std = c99,会发生这种情况:
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 compiler is almost certainly really a C++ compiler, so there are no software cost implications
将现有C代码移植到C的过程子集中通常会产生很大的成本影响.
所以建议’使用C std :: queue类’作为在C中寻找队列的库实现的问题的答案,而不是建议’使用目标C’和’使用JNI调用Java java.util.Queue类’或者“调用CPython库” – Objective C实际上是C(包括C99)的正确超集,Java和CPython库都可以直接从C调用,而不必将不相关的代码移植到C语言.
当然,您可以为C库提供C外观,但是一旦您这样做,C与Java或Python没有什么不同.