Partager via


Erreur C2653 ou C2039 lorsque vous essayez de référencer une fonction à partir de la bibliothèque STD C++

Cet article fournit des informations sur la résolution de l’erreur C2653 ou C2039 qui se produit lorsque vous référencez une fonction de la bibliothèque STD C++.

Version d’origine du produit : Visual C++
Numéro de la base de connaissances d’origine : 243444

Symptômes

Si vous essayez de référencer une fonction à partir de l’en-tête <cstdlib> de bibliothèque STD C++ à l’aide de l’espace de noms std (par exemple, std::exit(0)), le compilateur émet un message d’erreur C2653 ou C2039 (selon que l’espace de noms std est défini ou non au point où l’erreur est émise).

Cause

<cstdlib> ne définit pas l’espace de noms std. Cela est contraire à la documentation Visual C++, qui dit :

Incluez l’en-tête <cstdlib> standard pour inclure efficacement l’en-tête <stdlib.h> standard dans l’espace de std noms.

Résolution

Pour contourner le problème, placez dans #include <cstdlib> l’espace de noms std.

Plus d’informations

Si vous tentez de compiler les éléments suivants, le compilateur affiche l’erreur suivante :

erreur C2653 : 'std' : n’est pas un nom de classe ou d’espace de noms

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

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

Toutefois, si vous tentez de compiler les éléments suivants, le compilateur affiche l’erreur suivante :

erreur C2039 : 'exit' : n’est pas membre de 'std'

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

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

Dans le premier cas, l’erreur C2653 s’affiche, car l’espace de noms std n’a pas été défini. Dans le deuxième cas, la valeur C2039 s’affiche, car l’espace de noms std a été défini (dans l’en-tête <vector>), mais la fonction exit ne fait pas partie de cet espace de noms. Pour contourner le problème dans les deux cas, placez simplement dans #include <cstdlib> l’espace de noms std, comme suit :

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

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