使用英语阅读

通过


尝试从 STD C++ 库引用函数时出现 C2653 或 C2039 错误

本文提供有关解决从 STD C++ 库引用函数时发生的 C2653 或 C2039 错误的信息。

原始产品版本: Visual C++
原始 KB 数: 243444

现象

尝试使用命名空间std(例如,std::exit(0))从 STD C++ 库标头<cstdlib>引用函数会导致编译器发出 C2653 或 C2039(具体取决于是否在发出错误时定义命名空间std) 错误消息。

原因

<cstdlib> 不定义命名空间 std。 这与 Visual C++ 文档相反,该文档显示:

包括标准标头<cstdlib>,以有效包含命名空间中的std标准标头<stdlib.h>

解决方法

若要解决此问题,请将 #include <cstdlib> 问题置于命名空间 std中。

详细信息

尝试编译以下内容将导致编译器显示以下错误:

错误 C2653: “std” : 不是类或命名空间名称

// Compile Options: /GX
#include <cstdlib>

void main()
{
    std::exit(0);
}

但是,尝试编译以下内容会导致编译器显示以下错误:

错误 C2039:“exit”:不是“std”的成员

// Compile Options: /GX
#include <vector>
#include <cstdlib>

void main()
{
    std::exit(0);
}

在第一种情况下,将显示 C2653,因为尚未定义命名空间 std 。 第二种情况显示 C2039,因为命名空间 std 已定义(在标头 <vector>中),但该函数 exit 不是该命名空间的一部分。 若要在任一情况下解决此问题,只需将命名空间std#include <cstdlib>起来,如下所示:

// Compile Options: /GX
namespace std
{
    #include <cstdlib>
};

void main()
{
    std::exit(0);
}