Поделиться через


Ошибка C2653 или C2039 при попытке ссылаться на функцию из библиотеки STD C++

В этой статье содержатся сведения об устранении ошибки C2653 или C2039, возникающей при ссылке на функцию из библиотеки STD C++.

Исходная версия продукта: Visual C++
Исходный номер базы знаний: 243444

Симптомы

Попытка ссылаться на функцию из заголовка <cstdlib> библиотеки STD C++ с помощью пространства std имен (например, ) приводит к тому, 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);
}

В первом случае отображается C2653, так как пространство std имен не определено. Во втором случае отображается C2039, так как пространство std имен определено (в заголовке <vector>), но функция exit не является частью этого пространства имен. Чтобы обойти проблему в любом случае, просто заключите #include <cstdlib> его в пространство stdимен следующим образом:

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

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