Dei*_*Dei 106 c++ std language-lawyer
C在某种程度上并不完全是C++的一个子集.因此,我们可以通过更改名称(stdio.hto cstdio,stdlib.hto cstdlib)来使用C++中的大多数C函数/头文件.
我的问题实际上是一种语义.在C++代码(使用GCC编译器的最新版本),我可以打电话printf("Hello world!");,并std::printf("Hello world!");和它的工作原理完全一样.在我使用它的参考中也显示为std::printf("Hello world!");.
我的问题是,它是否更适合std::printf();在C++中使用?有区别吗?
ser*_*gej 102
从C++ 11标准(强调我的):
D.5 C标准库头文件[depr.c.headers]
- 为了与C标准库兼容......
- 每个C头(每个头都具有name.h形式的名称)的行为就好像每个由相应的cname头放置在标准库命名空间中的名称放在全局命名空间范围内.这是未指定的这些名字是否首次宣布或命名空间范围内定义(3.3.6)的命名空间性病,然后通过使用明确的-声明(7.3.3)注入到全局命名空间范围.
- 示例:标头
<cstdlib>确实在命名空间中std提供其声明和定义.它还可以在全局命名空间中提供这些名称.标题<stdlib.h>肯定在全局命名空间中提供相同的声明和定义,就像在C标准中一样.它还可以在命名空间中提供这些名称std.
不推荐使用«name.h»标头,它们已被确定为从未来版本中删除的候选者.
因此,我建议包含«cname»标头并使用std命名空间中的声明和定义.
如果由于某些原因必须使用«name.h»头文件(不推荐使用,请参见上文),我建议使用全局命名空间中的声明和定义.
换句话说:更喜欢
#include <cstdio>
int main() {
std::printf("Hello world\n");
}
Run Code Online (Sandbox Code Playgroud)
过度
#include <stdio.h>
int main() {
printf("Hello world\n");
}
Run Code Online (Sandbox Code Playgroud)
T.C*_*.C. 78
<cmeow>始终提供::std::purr,可能会或可能不会提供::purr.
<meow.h>始终提供::purr,可能会或可能不会提供::std::purr.
使用保证由您包含的标题提供的表单.
不,你也没关系.
在最初的目的就是让这个<___.h>标题会是这把一切都放在全局命名空间中的C版本和<c___>标题将是C++ -指明分数的版本,这一切都发生在std命名空间.
但实际上,C++版本还将所有内容都放入了全局命名空间.并且没有明确的共识认为使用这些std::版本是"正确的事情".
所以基本上,使用你喜欢的任何一个.最常见的可能是在全局命名空间中使用C标准库函数(printf而不是std::printf),但没有太多理由认为一个"更好"而不是另一个.