Compartilhar via


Erro C2653 ou C2039 ao tentar fazer referência a uma função da biblioteca STD C++

Este artigo fornece as informações sobre como resolver o erro C2653 ou C2039 que ocorre quando você faz referência a uma função da biblioteca STD C++.

Versão original do produto: Visual C++
Número original do KB: 243444

Sintomas

A tentativa de referenciar uma função do cabeçalho <cstdlib> da biblioteca STD C++ usando o namespace std (por exemplo, std::exit(0)) faz com que o compilador emita uma mensagem de erro C2653 ou C2039 (dependendo se o namespace std está definido ou não no ponto em que o erro é emitido).

Causa

<cstdlib> não define o namespace std. Isso é contrário à documentação do Visual C++, que diz:

Inclua o cabeçalho <cstdlib> padrão para incluir efetivamente o cabeçalho <stdlib.h> padrão no std namespace.

Solução

Para contornar o problema, coloque o #include <cstdlib> no namespace std.

Mais informações

A tentativa de compilar o seguinte fará com que o compilador exiba o seguinte erro:

erro C2653: 'std': não é um nome de classe ou namespace

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

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

No entanto, a tentativa de compilar o seguinte faz com que o compilador exiba o seguinte erro:

erro C2039: 'exit': não é membro de 'std'

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

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

No primeiro caso, o C2653 é exibido, pois o namespace std não foi definido. No segundo caso, o C2039 é exibido, porque o namespace std foi definido (no cabeçalho <vector>), mas a função exit não faz parte desse namespace. Para contornar o problema em ambos os casos, basta colocar o #include <cstdlib> no namespace std, da seguinte forma:

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

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