C++标准库中有哪些C标准库未覆盖的部分?

7
C++库包含与C语言库相同的定义,但是C++库似乎在非C库头文件中复制/扩展了一些C库功能。例如,C库有,而C++库有和; C库有,而C+库有和。
如果我需要一个字符串类,我认为最好使用而不是,因为可以从C++中所有非C功能(例如异常)中受益。但是,在C库中存在某些功能,在C++库中不存在任何其他形式。例如,我找不到除之外的任何内容,如memcpy和memcmp。
C库的哪些部分在非C库头文件中没有类似物?
(如果C++标准版本对此有影响,则我对C++11感兴趣。)

请注意:https://dev59.com/D2445IYBdhLWcg3wws8u - Karoly Horvath
<string>没有像<cstring>中的memcpy和memcmp那样的函数,原因是<string>并不是<cstring>的重新实现,而是一种完全不同的处理“文本操作”这个抽象问题空间的方法。其中之一区别于<cstring>的方法是使用了不同的语言,另一个是考虑到编程语言无关的原因(例如,零终止符与长度)。 - user395760
7
好的,我会尽力进行翻译:将memcpy替换为std::copy,将memcmp替换为std::equal - jalf
1个回答

13

头文件不是很多,所以让我们列出它们。有些可以用语言特性代替库。(我没有列举每个头文件中的每个函数,所以可能会错过一些函数,在它的同类大部分都有C++替代方案的情况下,这个函数可能没有C++替代方案)

C library         C++ alternatives
assert.h          Exceptions
complex.h         <complex>
ctype.h           None (or maybe <locale>, if you want to jump down that rabbit-hole)
errno.h           None (but only applies to C functions)
fenv.h            None
float.h           <limits>
inttypes.h        (See breakdown)
   formatting     <iostream>
   strto...       <string> (C++11), <sstream>
   imaxabs        std::abs overloads
   imaxdiv        std::div overloads
iso646.h          Language
locale.h          <locale>
math.h            None (extended with C++ overloads)
setjmp.h          Exceptions
signal.h          None
stdarg.h          Variadic templates (C++11)
stdbool.h         Language
stddef.h          None
stdint.h          None
stdio.h           <iostream> etc.
stdlib.h          (See breakdown)
   atof etc.      <sstream>, <string> (C++11)
   rand etc.      <random> (C++11)
   malloc etc.    new, containers
   abort etc.     None
   bsearch etc.   <algorithm>
   abs etc.       None (extended with C++ overloads)
   mb strings     None
string.h          <string>, <algorithm>
tgmath.h          <cmath> (C++ overloads)
time.h            <chrono> (C++11)
wchar.h           <iostream> etc.
wctype.h          None

总结一下:

C 库的哪些部分在非 C 库头文件中没有类似物?

[w]ctype.herrno.hfenv.hfenv.hmath.hsignal.hstddef.hstdint.h以及部分stdlib.h。在 C++11 之前,还有stdarg.htime.h和更多的stdlib.h


ctype.h中的特性被<locale>中的facet std::ctype所覆盖。 - Morwenn
stdint.h中的特性已经被<cstdint>所覆盖。 - timwoj
@Morwenn:好的,我对<locale>了解不多。 - Mike Seymour
@timwoj:是的,这是C++库头文件的包装器,就像<csdtdef>是<stddef.h>的包装器一样。 - Mike Seymour
@MikeSeymour难怪。我认为这是标准中文档化程度较低的部分之一。与标准的其他部分相比,关于<locale>的互联网文章非常少 :) - Morwenn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接