2

この問題は何週間も私を悩ませてきました。私はMSvs2010を使用しています。

#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> e:\ program files \ microsoft visual studio 10.0 \ vc \ include \ cstdlib(24):エラーC2039:'exit':'`グローバル名前空間''のメンバーではありません

1> 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ファイルが自動的にコンパイルされると思います。コメントを外すだけで、コードが機能します。

どうやら何人かの人々はこの解決策で問題を修正しました。_CRTIMP __declspec(noreturn) void __cdecl exit(__in int _Code);しかし、 stdlib.hでさえ見つけることができませんでした。

誰もがこれを修正する方法を知っていますか?

4

1 に答える 1

3

stdlib.h ファイルを調べたところ、次の行が推奨されていることがわかりました。

コメントアウトしないでください。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 は、コンパイラ ヘッダー ファイルを更新するサービス パックとセキュリティ更新プログラムをリリースします。ただし、ファイルが変更された場合はそうしません。これにより、相互に互換性がなくなったファイルの厄介な混合バッグが残る可能性があります.

これらのファイルに加えられた損傷を修正する必要があります。これらのファイルの変更されたタイムスタンプに注意して、変更された可能性のあるファイルを見つけてください。そして、友人や同僚などの正常なマシンからそれらをコピーします。もう 1 つの考えられる方法 (自分で試したことはありません) は、変更されたファイルを別の場所に移動し、セットアップを再度実行して、修復を依頼することです。それが機能するかどうかは実際にはわかりませんが、そうすべきです。また、そのようにする場合は、サービス パックを再適用してください。

于 2012-12-23T21:05:04.137 に答える