在 C + + 中使用 C 头时,我们应该使用来自 std: : 或全局名称空间的函数吗?

C 在某种程度上,并不完全是 C + + 的一个子集。因此,我们可以通过稍微改变一下名称(stdio.hcstdiostdlib.hcstdlib)来使用 C + + 中的大多数 C 函数/头文件。

我的问题其实是语义上的。在 C + + 代码中(使用最新版本的 GCC 编译器) ,我可以调用 printf("Hello world!");std::printf("Hello world!");,它们的工作原理完全一样。在参考中,我使用它也出现作为 std::printf("Hello world!");

我的问题是,在 C + + 中使用 std::printf();更好吗? 有区别吗?

7693 次浏览

只使用没有 std::printf可能会产生一些名称冲突,许多 c + + 开发人员认为这是一种不好的做法。谷歌是你的朋友在这一点上,但这里有一些链接,希望这有所帮助

为什么“使用名称空间 std”被认为是不好的做法? Http://www.cplusplus.com/forum/beginner/61121/

<cmeow>始终提供 ::std::purr,可能提供也可能不提供 ::purr

<meow.h>始终提供 ::purr,可能提供也可能不提供 ::std::purr

使用保证由包含的标头提供的表单。

The only difference there is is that in std::printf() by adding std:: scope resolution you will secure yourself from someone writing a function with the same name in the future, which would lead to namespace conflict. Both usages will lead to exactly the same OS API calls (you can check it under Linux by running strace your_program).

我发现很少有人会这样命名一个函数,因为 printf()是最常用的函数之一。此外,在 C + + 中,iostream优先于对类似 printf 的 cstdio函数的调用。

来自 C + + 11标准:

每个 C 头都有一个名称为 name.h 的形式 类放置在标准库命名空间中的每个名称 相应的 cname 头放置在全局命名空间中 没有指定这些名称是首先声明的还是 在命名空间 std 的命名空间范围(3.3.6)内定义,并且是 然后通过显式的 Using 声明(7.3.3)。

So, if you use <cstdio>, you can be sure, that printf will be in the namespace std, and hence not in global namespace.
使用全局名称空间会产生名称冲突。 < strong > 这不是 C + + 的方式。

因此,我使用 <cstdio>头,并建议您这样做。

不,不管怎样你都很好。

原创的的意图是,<___.h>头是将所有内容放在全局名称空间中的 C 版本,而 <c___>头是 C + + 化的版本,将所有内容放在 std名称空间中。

但是在实践中,C + + 版本的 还有将所有内容都放在全局名称空间中。而且,目前还没有明确的共识认为使用 std::版本是“正确的做法”。

所以基本上,你喜欢用哪个就用哪个。最常见的可能是在全局名称空间中使用 C 标准库函数(printf而不是 std::printf) ,但是没有太多理由认为其中一个函数比另一个“更好”。

来自 C + + 11标准(重点是我的标准) :

D. 5 C 标准库头[ depr.c.headers ]

  1. 为了与 C 标准库兼容..。
  2. 每个 C 头(每个头都有一个形式为 姓名 H的名称)的行为就好像每个名称都放在标准中一样 库名称空间中对应的 姓名标头放置在 全局命名空间范围内。名称空间 性病未指定这些名称是首先在命名空间范围内声明还是定义(3.3.6) ,然后通过显式 using-Declaration (7.3.3)将其注入全局名称空间范围。
  3. 示例: <cstdlib> assuredly在名称空间中提供了它的声明和定义 < strong > std .它还可以在全局命名空间中提供这些名称。头 <stdlib.h>当然提供了与 C 标准中相同的声明和定义 在全局命名空间中。它 也可以在名称空间 std中提供这些名称。

Using the «name.h» headers is deprecated, they have been identified as candidates for removal from future revisions.

因此,我建议包含“ cname”头并使用来自 std名称空间的声明和定义。

如果由于某些原因必须使用“ name.h”头(不推荐使用这个头,见上文) ,我建议使用全局名称空间中的声明和定义。

换句话说: 喜欢

#include <cstdio>


int main() {
std::printf("Hello world\n");
}

结束了

#include <stdio.h>


int main() {
printf("Hello world\n");
}

在录音棚

这是 C + + 版本的 Standard C Library 头@c stdio.h, 它的内容(大部分)与标题相同,但都是 包含在名称空间@c std 中(定义的名称除外) 作为 C 中的宏)。

所以不会有什么不同。

根据我自己的实践: 使用 std::前缀。否则有一天 abs 威尔咬你非常痛苦的情况下你使用浮点。

非限定的 abs是指在某些平台上定义在 int上的函数。在其他国家,则是负荷过重。但是,对于所有类型,std::abs总是重载。