以下是C++的优点

  • C++提供了他们所询问的特定功能
  • 他们的C编译器几乎肯定是C++编译器,因此没有软件成本的含义.
  • C++和C一样可移植.
  • C++代码可以和C一样有效(或者更多,或者更少)

有没有什么具体的原因和具体的场景,必须使用C而不是C++?

关于这个问题:Library for generics in C

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

Peter Kirkham's post was for me the most informative, particularly with regard to C99 issues which I hadn't considered, so I've accepted it. Thanks to all others who took part.

推荐答案

这是由我给一个当前问题的答案,它询问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就没有什么不同.

C++相关问答推荐

在C中,entry = fgets(entry,sizeof(entry),*pt)是否是错误?

有关字符数组指针和次指针以及qsort函数中的cmp函数的问题

C sscanf没有捕获第二个参数

为什么在传输 Big Data 时共享内存段的运行时间比管道更长?

gcc已编译的可执行文件TSB是否同时暗示最低有效字节和最低有效位?

我应该如何解决我自己为iOS编译的xmlsec1库的问题?转换Ctx.first在xmlSecTransformCtxPrepare()之后为空

ZED for SDL上的C语言服务器

正在try 将文件/文件夹名从目录 struct 存储到链接列表

SDL 2.0-从数组渲染纹理

C中的指针增量和减量(*--*++p)

为静态库做准备中的奇怪行为

错误Cygwin_Except::Open_stackdupfile:正在转储堆栈跟踪是什么?

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

Go和C中的数据 struct 对齐差异

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

赋值两侧的后置增量,字符指针

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

不兼容的整数到指针转换传递';char';到类型';常量字符*

变量的指针右对齐,函数的指针左对齐

C simd _m128 晶圆厂