在C ++中使用C头文件时,我们应该使用std ::还是全局名称空间的函数?
C有点,不完全是C ++的一个子集。 所以我们可以通过改变名称( stdio.h
到cstdio
, stdlib.h
到cstdlib
)来使用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]
- 为了与C标准库兼容…
- 每个C头都有一个name.hforms的名字 ,就好像每个名字放在标准库名字空间中的相应的cname头部一样放在全局名字空间的作用域内。 没有指定这些名称是首先在名称空间std的名称空间作用域 (3.3.6) 中 声明还是定义的 ,然后通过显式使用声明(7.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/