这是由我对当前问题的回答引发的,该问题询问 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 程序员都回避它;见证 Stack Overflow 上到处都是“不要强制转换 malloc”评论) 。
它们不是同一种语言,如果您有一个现有的 C 项目,您不想只是为了使用库而用不同的语言重写它。您更愿意使用可以以您正在使用的语言进行交互的库。(在某些情况下,这可以通过一些extern "C"
包装函数,取决于 C++ 库的模板/内联方式。)
取我正在开发的项目中的第一个 C 文件,如果你只是交换,就会发生这样的情况gcc std=c99
for 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 代码移植到 C++ 过程子集通常会产生重大成本影响。
所以建议'使用 C++ std::queue 类'作为问题的答案,在 C 中寻找队列的库实现比建议更迟“使用目标C” and '使用 JNI 调用 Java java.util.Queue 类' or '调用Python库'- Objective C 实际上是 C 的超集(包括 C99),Java 和 CPython 库都可以直接从 C 调用,而无需将不相关的代码移植到 C++ 语言。
当然,您可以为 C++ 库提供 C 外观,但一旦您这样做,C++ 就与 Java 或 Python 没有什么不同了。