为什么 getenv() 可以在没有 std:: 的情况下解析名称?
why getenv() can get name resolved without a std::?
getenv() 有一个 C++ 实现,可以包含在头文件中。所以它是命名空间 std 的成员。但是,即使没有 std::getenv(),getenv() 函数也可以在我的代码中正确解析,这意味着我的后续程序可以编译并且 运行 没有任何错误和警告。那么为什么 getenv() 作为名称空间 std 的名称成员可以在没有 std:: 的情况下得到解析?我的 OS 和编译器分别是 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;
}
您的代码可能不可移植。顺便说一句,它 seems to work 即使不包括 <cstdlib>
。如果我们仔细看声明:
http://en.cppreference.com/w/cpp/utility/program/getenv
我们看到确实属于cstdlib
,通常的约定是所有header开头的c
+前面的C-likeheader 现在在 namespace std;
,所以你应该使用 std::
。
std::string
也是如此,似乎包含在许多标准库 header 中,但如果您查看标准,则不应依赖于此。
当您 include
c* headers 之一时,标准 要求 名称位于 std
命名空间中,但是允许它们首先被放入全局命名空间,然后复制到std
。
相反,当您 include
*.h headers 之一(已弃用)时,标准 要求 将名称放入全局命名空间,但 允许 它们首先在 std
命名空间中声明并复制过来。
来自 [headers] / 4
[...] It is unspecified whether these names are first declared within the
global namespace scope and are then injected into namespace std by
explicit using-declarations (7.3.3).
来自 [depr.c.headers]
从技术上讲,为了获得最大的可移植性,您应该在 c* headers 中为名称(当然除了宏)加上前缀 std
,尽管以我有限的经验,我还没有遇到过这样的实现'也在全局命名空间中声明它们。
在提问之前尝试使用搜索。这是 why and how does rand() exist both in global and std namespace in cstdlib?
的副本
C++11 标准:D.5 C 标准库头文件
第 3 段:
The header <cstdlib>
assuredly provides its declarations and definitions within the namespace std
. It may also provide these names within the global namespace. The header <stdlib.h>
assuredly provides the same declarations and definitions within the global namespace, much as in the C Standard. It may also provide these names within the namespace std
.
getenv() 有一个 C++ 实现,可以包含在头文件中。所以它是命名空间 std 的成员。但是,即使没有 std::getenv(),getenv() 函数也可以在我的代码中正确解析,这意味着我的后续程序可以编译并且 运行 没有任何错误和警告。那么为什么 getenv() 作为名称空间 std 的名称成员可以在没有 std:: 的情况下得到解析?我的 OS 和编译器分别是 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;
}
您的代码可能不可移植。顺便说一句,它 seems to work 即使不包括 <cstdlib>
。如果我们仔细看声明:
http://en.cppreference.com/w/cpp/utility/program/getenv
我们看到确实属于cstdlib
,通常的约定是所有header开头的c
+前面的C-likeheader 现在在 namespace std;
,所以你应该使用 std::
。
std::string
也是如此,似乎包含在许多标准库 header 中,但如果您查看标准,则不应依赖于此。
当您 include
c* headers 之一时,标准 要求 名称位于 std
命名空间中,但是允许它们首先被放入全局命名空间,然后复制到std
。
相反,当您 include
*.h headers 之一(已弃用)时,标准 要求 将名称放入全局命名空间,但 允许 它们首先在 std
命名空间中声明并复制过来。
来自 [headers] / 4
[...] It is unspecified whether these names are first declared within the global namespace scope and are then injected into namespace std by explicit using-declarations (7.3.3).
来自 [depr.c.headers]
从技术上讲,为了获得最大的可移植性,您应该在 c* headers 中为名称(当然除了宏)加上前缀 std
,尽管以我有限的经验,我还没有遇到过这样的实现'也在全局命名空间中声明它们。
在提问之前尝试使用搜索。这是 why and how does rand() exist both in global and std namespace in cstdlib?
的副本C++11 标准:D.5 C 标准库头文件
第 3 段:
The header
<cstdlib>
assuredly provides its declarations and definitions within the namespacestd
. It may also provide these names within the global namespace. The header<stdlib.h>
assuredly provides the same declarations and definitions within the global namespace, much as in the C Standard. It may also provide these names within the namespacestd
.