在vs2010中使用iostream时,我得到错误C2039:'exit':不是'`global namespace''的成员

时间:2012-12-23 20:11:11

标签: c++ visual-studio-2010 iostream

这个问题几周来一直困扰着我。我正在使用MS vs2010。

#include <iostream>
int main()
{
    std::cout << "Enter two numbers:" << std::endl;
    int v1 = 0, v2 = 0;
    std::cin >> v1 >> v2;
    std::cout << "The sum of " << v1 << " and " << v2
    << " is " << v1 + v2 << std::endl;
    return 0;
}

来自C ++ Primer的简单程序。当我编译它时,我收到以下错误信息:

  

1&gt; e:\ program files \ microsoft visual studio 10.0 \ vc \ include \ cstdlib(24):错误C2039:'exit':不是'`global namespace''的成员

     

1&gt; e:\ program files \ microsoft visual studio 10.0 \ vc \ include \ cstdlib(24):错误C2873:'exit':符号不能在using-declaration中使用

我试图找到一些解决方案,我得到了这个:

http://social.msdn.microsoft.com/Forums/nl-NL/Vsexpressvc/thread/31385f37-94b8-4297-b054-7fdbc5b1f51e

说:

  

解决方案:

     

我在网上研究过这个问题,似乎这对很多人来说都是一个问题。解决方案就像删除评论一样简单。

     

我查看了stdlib.h文件,发现以下行被推荐出来了:

_CRTIMP __declspec(noreturn) void __cdecl exit(__in int _Code);
  

我拿出评论并重新编译,现在它可以正常工作。

     

我相信在某些版本中,stdlib.h文件将自动编译,并且该部分代码已被注释掉。简单的取消注释,您的代码将起作用。

显然有些人用这个解决方案解决了这个问题。但是,我甚至无法在stdlib.h中找到_CRTIMP __declspec(noreturn) void __cdecl exit(__in int _Code);

任何人都知道如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

  

我查看了stdlib.h文件,发现以下行被推荐出来了:

NOT 应该被注释掉。 stdlib.h的那部分应该如下所示:

#ifndef _CRT_TERMINATE_DEFINED
#define _CRT_TERMINATE_DEFINED
_CRTIMP __declspec(noreturn) void __cdecl exit(_In_ int _Code);
_CRTIMP __declspec(noreturn) void __cdecl _exit(_In_ int _Code);
_CRTIMP __declspec(noreturn) void __cdecl abort(void);
#endif

目前尚不清楚如何在您的文件版本中进行评论。但很明显,您可以毫不犹豫地编辑编译器头文件以解决问题。您之前可能已经完成此操作以绕过问题而不记得它。

一般来说,这是一个真的很糟糕的想法。 Microsoft发布将更新编译器头文件的Service Pack和安全更新。但如果文件被更改,它将不会这样做。这可能会给你带来一堆混乱的文件,这些文件不再相互兼容。

您需要修复对这些文件造成的损害。请注意这些文件的修改时间戳,以找出可能已更改的文件。并复制那些来自知名机器的人,比如朋友或同事。另一种可能的方法(从未尝试过)是将更改的文件移动到其他地方并再次运行安装程序,要求进行修复。不确定这是否有效,它应该。当你这样做时也重新应用服务包。