Błąd C2653 lub C2039 podczas próby odwołania się do funkcji z biblioteki STD C++

Ten artykuł zawiera informacje dotyczące rozwiązywania błędu C2653 lub C2039 występującego podczas odwoływanie się do funkcji z biblioteki STD C++.

Oryginalna wersja produktu: Visual C++
Oryginalny numer KB: 243444

Symptomy

Próba odwołania się do funkcji z nagłówka <cstdlib> biblioteki STD C++ przy użyciu przestrzeni nazw std (na przykład ) powoduje, że kompilator emituje komunikat o błędzie C2653 lub C2039 (w zależności od tego, std::exit(0)czy przestrzeń nazw std jest zdefiniowana w punkcie, w którym jest emitowany błąd).

Przyczyna

<cstdlib> nie definiuje przestrzeni nazw std. Jest to sprzeczne z dokumentacją języka Visual C++, która mówi:

Uwzględnij nagłówek standardowy, aby skutecznie uwzględnić nagłówek <cstdlib> <stdlib.h> standardowy w std przestrzeni nazw.

Rozwiązanie

Aby obejść ten problem, umieść element #include <cstdlib> w przestrzeni nazw std.

Więcej informacji

Próba skompilowania następującego elementu spowoduje, że kompilator wyświetli następujący błąd:

błąd C2653: "std": nie jest nazwą klasy ani przestrzeni nazw

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

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

Jednak próba skompilowania następujących przyczyn powoduje, że kompilator wyświetli następujący błąd:

błąd C2039: "exit" : nie jest członkiem "std"

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

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

W pierwszym przypadku jest wyświetlany kod C2653, ponieważ przestrzeń nazw std nie została zdefiniowana. W drugim przypadku jest wyświetlany kod C2039, ponieważ przestrzeń nazw std została zdefiniowana (w nagłówku <vector>), ale funkcja exit nie jest częścią tej przestrzeni nazw. Aby obejść ten problem w obu przypadkach, po prostu ująć element #include <cstdlib> w przestrzeni nazw stdw następujący sposób:

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

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