为什么getenv()可以在没有std::”的情况下解析名称? GETEnVE()具有C++实现,可以包含在头文件中。因此它是namespace std的一个成员。但是,即使没有std::getenv(),getenv()函数也可以在我的代码中正确解析,这意味着我的follow程序可以在没有任何错误和警告的情况下编译和运行。那么,为什么作为名称空间std的名称成员的getenv()可以在没有std的情况下得到解析:?我的操作系统和编译器分别是Ubuntu 12.04 i386和g++4.8.1 #include <cstdlib> #include <iostream> int main() { char * path_env; path_env = getenv("PATH"); //without a name resolve operation std::getenv() std::cout << path_env << std::endl; return 0; } #包括 #包括 int main() { 字符*path_env; path_env=getenv(“path”);//无名称解析操作std::getenv() std::cout

为什么getenv()可以在没有std::”的情况下解析名称? GETEnVE()具有C++实现,可以包含在头文件中。因此它是namespace std的一个成员。但是,即使没有std::getenv(),getenv()函数也可以在我的代码中正确解析,这意味着我的follow程序可以在没有任何错误和警告的情况下编译和运行。那么,为什么作为名称空间std的名称成员的getenv()可以在没有std的情况下得到解析:?我的操作系统和编译器分别是Ubuntu 12.04 i386和g++4.8.1 #include <cstdlib> #include <iostream> int main() { char * path_env; path_env = getenv("PATH"); //without a name resolve operation std::getenv() std::cout << path_env << std::endl; return 0; } #包括 #包括 int main() { 字符*path_env; path_env=getenv(“path”);//无名称解析操作std::getenv() std::cout,c++,getenv,token-name-resolution,C++,Getenv,Token Name Resolution,您的代码可能不可移植。顺便说一句,即使不包含,它也不可移植。如果我们仔细查看声明: 我们看到它确实属于cstdlib,通常的约定是,所有以c+以前的类c头开头的头现在都位于名称空间std;,因此您应该使用std: std::string也会发生同样的情况,它似乎包含在许多标准库标题中,但如果您查看标准,则不应依赖于此。当您包含一个c*标题时,标准要求名称位于std命名空间中,但允许首先将它们放入gl中然后复制到std 相反,当包含其中一个*.h头(已弃用)时,标准要求将名称放入全局名称空间,但

您的代码可能不可移植。顺便说一句,即使不包含
,它也不可移植。如果我们仔细查看声明:

我们看到它确实属于
cstdlib
,通常的约定是,所有以
c
+以前的类c头开头的头现在都位于
名称空间std;
,因此您应该使用
std:


std::string
也会发生同样的情况,它似乎包含在许多标准库标题中,但如果您查看标准,则不应依赖于此。

当您
包含一个c*标题时,标准要求名称位于
std
命名空间中,但允许首先将它们放入gl中然后复制到
std

相反,当
包含
其中一个*.h头(已弃用)时,标准要求将名称放入全局名称空间,但允许首先在
std
名称空间中声明并复制它们

从[标题]/4

[…]未指定这些名称是否首先在 全局命名空间范围,然后通过std注入命名空间 显式使用声明(7.3.3)

来自[部门c.标题]


从技术上讲,为了实现最大的可移植性,您应该在c*标题中使用
std
作为名称前缀(当然宏除外),尽管根据我有限的经验,我还没有遇到一个实现不在全局命名空间中声明它们。

在提问之前尝试使用搜索。这与

C++11标准:D.5 C标准库标题
第3段:

标头
确实在命名空间
std
中提供了声明和定义。它也可以在全局命名空间中提供这些名称。标头
确实在全局命名空间中提供了与C标准中相同的声明和定义。它还可以提供这些名称在命名空间
std


当包含
cstdlib
时,函数是否在全局命名空间中以及
std
中。有趣的是,你能提供标准的引用吗?尽管如此,我不会允许这样做,因为它可能会创建不可移植的代码。你应该投票将其作为副本关闭,而不是发布答案。我不知道怎么做。对不起,我忘了你需要3000个信誉点才能做到这一点。一旦你获得该特权,每个问题的底部都会有一个“关闭”链接。同时,可能最好在问题上发表评论,指向重复项;然后,更高的代表用户可以投票关闭它。