与 C 语言相比,C++ 有哪些限制? [关闭]

2023-12-08

以下是C++的好处

  • C++ 提供了他们询问的具体功能
  • 他们的 C 编译器几乎肯定是 C++ 编译器,因此不存在软件成本问题
  • C++ 与 C 一样可移植
  • C++ 代码可以与 C 一样高效(或者更高,或者更低)

是否有任何具体原因和特定场景必须使用 C 而不是 C++?

参考这个问题:C 中的泛型库

不是重复的,因为这个问题询问的是语言限制,而不是关于应该/不应该学习一种语言而不是另一种语言。

Peter Kirkham 的帖子对我来说信息量最大,特别是关于我没有考虑过的 C99 问题,所以我接受了它。感谢所有其他参与的人。


这是由我对当前问题的回答引发的,该问题询问 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 没有什么不同了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与 C 语言相比,C++ 有哪些限制? [关闭] 的相关文章

随机推荐