正在使用命名空间std;强制性的

时间:2019-02-25 23:23:07

标签: c++

这段代码为什么不需要std名称空间。

#include <stdio.h>

int main()
{
     printf("Hello World");
     return 0;
}

3 个答案:

答案 0 :(得分:2)

因为您包含的是C标头,而不是C ++标头。

  

[library.c/1]: C ++标准库还提供了经过适当调整以确保静态类型安全的C标准库的功能。

     

[depr.c.headers.other/1]: <complex.h><iso646.h><stdalign.h><stdbool.h><tgmath.h>以外的每个C标头每个名称的格式为<name.h>,其行为就像是将由相应<cname>标头放置在标准库名称空间中的每个名称都放在全局名称空间范围内 ,除了[sf.cmath]中描述的功能,std::byte[cstddef.syn])的声明以及[support.types.byteops]中描述的功能和功能模板之外。 [..] 未指定这些名称是先在名称空间[basic.scope.namespace]的名称空间范围(std)中声明还是定义,然后注入全局变量中命名空间范围由显式 using-declarations [namespace.udecl]

表示。

上面的最后一个粗体部分表示您也许也可以使用std::printf,但不能保证如此。

还请注意,标头已弃用:

  

[diff.mods.to.headers/1]:为了与C标准库兼容,C ++标准库提供了[depr.c.headers]中枚举的C标头,但在C ++中不推荐使用它们。

在硬币的反面,如果您包含cstdio,则可以保证获得std::printf,但可以获取::printf(全限定名称)您使用的全局符号的数量)将无法得到保证:

  

[headers/4]:[library][thread][depr]中所述外,每个标头 cname 的内容与C标准库中指定的相应头文件 name.h 的名称。但是,在C ++标准库中,声明(在C中定义为宏的名称除外)在名称空间std 的名称空间范围内。 尚不确定这些名称(包括在[language.support][thread][depr]中的重载)是否首先在全局名称空间范围内声明并且是否然后通过明确的 using-declarations std)注入命名空间[namespace.udecl]


简短版本:

  • 诸如stdio.h之类的C头位于全局命名空间中,并且可能也位于std中;
  • 诸如cstdio之类的C ++标头位于命名空间std中,也可能位于全局命名空间中。

使用命名空间using namespace std时仅需要std::std

答案 1 :(得分:1)

stdio.h头文件允许您使用标准库中默认不存在于所有C ++代码中的其他方法。通过添加#include行,您将指示编译器将该头文件中的声明复制到您的代码中,以便您可以访问它们。

using namespace std允许您利用标准名称空间中的方法,而不必每次都调用标准名称空间。这有助于消除拼写错误,但可能会导致其他错误(如果两个名称空间具有相同的方法签名)。 例如,

#include <iostream> std::cout << "Hello World!" << std::endl;

可以写为:

#include <iostream> using namespace std; cout << "Hello World!" << endl;

答案 2 :(得分:0)

using namespace std使标准名称空间中的名称在您的名称空间中可见。

stdio.h是一个标头,它不使用其自己的名称空间,而是将其功能(例如printf)等放入包含它的名称空间(在您的情况下为全局名称空间)。因此,您可以直接访问它们。

请注意,通常不建议在名称空间中包含标头(请参阅示例的第一个注释),我之所以仅提及它是出于完整性的考虑,因为对于初学者而言,include的位置可能会有所不同