cstdlib和stdlib.h有什么区别?

60
在编写C++代码时,以下两种方式有什么不同:
#include <cstdlib>

#include <stdlib.h>

除了前者大部分被包含在std::命名空间中,还有其他的原因吗?

除了编程规范和风格之外,还有其他原因可以使用其中一个而不是另一个吗?


可能是stdlib.h和cstdlib在C++中的主要区别是什么?的重复问题。 - phuclv
似乎没有任何答案提到的一点是:在C++中,后者已被弃用 - Pharap
@Pharap 已修复。 - klutt
3个回答

54
第一个是C++头文件,第二个是C头文件。由于第一个使用了命名空间,因此似乎更可取。

17

除了命名空间的情况之外,它们基本上是相同的。


11
除了编码规范和样式之外,是否有其他原因可以使用其中之一?是的。stdlib.h废弃是不使用它的非常好的理由。它实际上在1998年出现的第一个标准中就已经被弃用了。当然,它仍然存在于C++14中,并且可能甚至包括或甚至可能在C++17中(我没有访问C++17标准),但由于它被弃用了,这是一个强烈的信号表明您不应该使用它。也许删除的风险并不是很高,但为什么要冒这个险呢?当编写新代码时,避免使用它非常容易。

来自C++14标准:

这些都是弃用的功能,其中弃用是定义为:对于当前版的标准具有规范性,但已被确定为候选从未来修订中删除

...

除此之外,您还需要注意到实践问题,即cstdlib使用命名空间,在大多数情况下都更可取。


6
那也完全没有用,因为无论如何它都不会被删除 - 与 C 的互操作性需要这样做。 翻译:这也完全无用,因为它永远不会被移除 - 与 C 的互操作性需要这样做。 - user1143634
1
@StaceyGirl 是的,但大多数(也许全部)C头文件都已过时。 - klutt
1
@StaceyGirl,所以你说的不是关于Interop,而是关于在两种语言中构建相同的代码。是的,在这种情况下,你所有的C代码都需要是有效的C++代码,反之亦然。但是,如果你正确地拆分头文件和源文件,并将C源文件构建为C,则我看不出有什么问题? - Lightness Races in Orbit
1
@StaceyGirl 我会说 stddef.h 存在问题,而 stdlib.h(所讨论的头文件)则没有! - Lightness Races in Orbit
1
@StaceyGirl 在这方面是相同的,因为两个决定都会破坏向后兼容性(从而破坏现有代码)。C头文件不需要能够编写适用于两种语言的库。可以完全有条件地包含<cstdlib>并使用using指令将名称从std::带入全局范围。此外,应尽量将C和C++代码混合使用保持在最低限度,因为并非所有有效的C代码都是有效的C++代码,代码行为可能会有很大差异 - Pharap
显示剩余28条评论

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