STD C++ ライブラリから関数を参照しようとすると、C2653 または C2039 エラーが発生する

この記事では、STD C++ ライブラリから関数を参照するときに発生する C2653 または C2039 エラーの解決に関する情報を提供します。

元の製品バージョン: Visual C++
元の KB 番号: 243444

現象

名前空間 std (たとえば) を使用して STD C++ ライブラリ ヘッダー<cstdlib>から関数を参照しようとすると、std::exit(0)コンパイラは C2653 または C2039 (エラーが生成された時点で名前空間stdが定義されているかどうかに応じて) エラー メッセージを出力します。

原因

<cstdlib> は名前空間 stdを定義しません。 これは、次の Visual C++ ドキュメントに反します。

標準ヘッダー <cstdlib> を含め、名前空間内に標準ヘッダー <stdlib.h> を効果的に std 含めます。

解決方法

問題を回避するには、 を #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);
}

最初のケースでは、名前空間 std が定義されていないため、C2653 が表示されます。 2 番目のケースでは、名前空間 std が (ヘッダー <vector>で) 定義されているため、C2039 が表示されますが、関数 exit はその名前空間の一部ではありません。 どちらの場合も問題を回避するには、次のように、 を #include <cstdlib> 名前空間 stdに囲むだけです。

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

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