为什么 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.