在C ++中使用C头文件时,我们应该使用std ::还是全局名称空间的函数?

C有点,不完全是C ++的一个子集。 所以我们可以通过改变名称( stdio.hcstdiostdlib.hcstdlib )来使用C ++中的大部分C函数/头文件。

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

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

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

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

  1. 为了与C标准库兼容…
  2. 每个C头都有一个name.hforms的名字 ,就好像每个名字放在标准库名字空间中的相应的cname头部一样放在全局名字空间的作用域内。 没有指定这些名称是首先在名称空间std的名称空间作用域 (3.3.6) 声明还是定义的 ,然后通过显式使用声明(7.3.3)将其注入到全局名称空间作用域中。
  3. 示例:头文件<cstdlib> 确实 在名称空间std提供了它的声明和定义。 它也可能在全局命名空间中提供这些名字。 头文件<stdlib.h> 确实 在全局命名空间中提供了相同的声明和定义,就像在C标准中一样。 它也可能在名字空间std提供这些名字。

使用«name.h»标题已被弃用,他们已被确定为从未来版本中删除的候选人。

所以,我build议包含«cname»头文件并使用std命名空间中的声明和定义。

如果由于某些原因必须使用«name.h»头文件(已经过时,请参阅上文),我会build议使用全局名称空间中的声明和定义。

换句话说:喜欢

 #include <cstdio> int main() { std::printf("Hello world\n"); } 

过度

 #include <stdio.h> int main() { printf("Hello world\n"); } 

总是提供::std::purr ,可能或不可以提供::purr

总是提供::purr ,可能或不可以提供::std::purr

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

不,你无论如何都可以。

最初的意图是<___.h>头文件将C语言版本放在全局名称空间中,而<c___>头文件将是C ++版本,它将所有东西放在std名称空间中。

但实际上,C ++版本将所有内容放入全局名称空间中。 并没有明确的共识,使用std::版本是“正确的事情”。

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

从我自己的做法:使用std::前缀。 否则,有一天abs 痛苦地咬你,如果你使用浮点。

非限定的abs是指在某些平台上定义在int上的函数。 在别人身上,它是超负荷的。 但是std::abs总是被所有types重载。

唯一的区别就是在std::printf()添加了std:: scope解决scheme,这样你就std::将来某个人写同名的函数,这会导致命名空间冲突。 这两种用法都会导致完全相同的OS API调用(您可以通过运行strace your_program来在Linux下进行检查)。

我觉得不太可能有人会这样命名一个函数,因为printf()是那里最常用的函数之一。 另外,在C ++中, iostream通过调用printf等cstdio函数来进行优化。

从C ++ 11标准:

每个C头都有一个name.hforms的名字,就好像每个名字放在标准库名字空间中的相应的cname头部一样放在全局名字空间的作用域内。 没有指定这些名称是首先在名称空间std的名称空间作用域(3.3.6)中声明还是定义的,然后通过显式使用声明(7.3.3)将其注入到全局名称空间作用域中。

因此,如果使用<cstdio> ,那么可以肯定的是, printf将位于namespace std ,因此不在全局命名空间中。
使用全局名称空间会创build名称冲突。 这不是C ++的方式。

因此,我正在使用<cstdio>标题,并build议您这样做。

在stdio

这是标准C库标题@c stdio.h的C ++版本,其内容(大部分)与该标题相同,但都包含在命名空间@c std中(除了名称被定义为macrosC)。

所以它不应该有任何区别。

只使用printf而不使用std::会产生一些名称冲突,被很多c ++开发者认为是不好的做法。 谷歌是你的朋友在这一个,但这里有一些链接,希望这可以帮助

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