Standard C++ ライブラリについてよく寄せられる質問

この記事では、Standard C++ ライブラリに関してよく寄せられる質問 (FAQ) とその質問に対する回答の一覧を示します。

元の製品バージョン: Visual C++
元の KB 番号: 154419

Standard C++ ライブラリに含まれる内容

Standard C++ ライブラリは拡張可能なフレームワークを提供し、言語サポート、診断、一般的なユーティリティ、文字列、ロケール、標準テンプレート ライブラリ (コンテナー、反復子、アルゴリズム、数値)、および入出力用のコンポーネントが含まれています。

Standard C++ ライブラリは、次のカテゴリに分けることができます。

  1. 標準テンプレート ライブラリ (STL) コンポーネントは、最も広く使用されているアルゴリズムとデータ構造のサブセットにアクセスできる C++ プログラムを提供します。 STL ヘッダーは、次の 3 つの主要な編成概念にグループ化できます。

    • コンテナー: 、 などのvectorstackdequequeuelistsetデータを整理するための一般的な方法をサポートするmapテンプレート クラス。

    • アルゴリズム: 関数、アルゴリズム、数値など、オブジェクトのシーケンスに対して一般的な操作を実行するためのテンプレート関数。

    • 反復子: ユーティリティ、反復子、メモリなど、アルゴリズムとコンテナーを一緒に貼り付ける接着。

  2. 入力/出力には、(iosfwd)、定義済みiostreamsオブジェクト ()、基本iostreamsクラス (iostream)、ストリーム バッファリング (iosstreambuf)、ストリームの書式設定とマニピュレーター (、、)、文字列ストリーム (iosmanip)、ostreamistreamおよびファイル ストリーム (fstreamsstream) の前方宣言iostreams用のコンポーネントが含まれています。

  3. その他の標準 C++ ヘッダーは次のとおりです。

    • 言語のサポート: ライブラリ全体で使用される一般的な型定義 (cstddef)、定義済み型 (limits、、) の特性、C++ プログラムの開始と終了をサポートする関数 ()、climitscfloat動的メモリ管理 (cstdlib)、動的型識別のnewサポート ()、例外処理のtypeinfoサポート (exception)、その他のランタイム サポート (cstdarg、、、ctimecsetlmpcsignal)。

    • 診断: いくつかの種類の例外条件 ()、プログラム アサーションの文書化 (stdexcept)、およびエラー番号コードのグローバル変数 (cassertcerrno) を報告するためのコンポーネント。

    • 文字列: 文字列クラス (string) および null で終わるシーケンス ユーティリティ (cctype、、cwctypecwchar) のコンポーネント。

    • ローカライズ: C++ プログラムがカルチャの違いをカプセル化するために使用できるコンポーネント。 ロケール機能には、文字分類と文字列の照合順序、数値、通貨、日付/時刻の書式設定と解析、メッセージ取得 (localeclocale) の国際化サポートが含まれています。

CRT ライブラリと Standard C++ ライブラリの違いは何ですか? ランタイム ライブラリ コンパイラ オプションに含まれるライブラリ

Visual C++ には、Microsoft Foundation クラス (MFC) ライブラリ以外に次のライブラリが含まれています。

  • 基本的な C ランタイム ライブラリ
  • 標準 C++ ライブラリ
ライブラリの種類と関連するコンパイラ スイッチ 基本 C ランタイム ライブラリ/ Standard C++ ライブラリ
シングル スレッド (/ML) Libc。LIB/LIBCP。Lib
シングル スレッド (/MLd) をデバッグする LIBCD。LIB/LIBCPD。Lib
マルチスレッド (/MT) LIBCMT。LIB/LIBCPMT。Lib
マルチスレッド (/MTd) のデバッグ LIBCMTD。LIB/LIBCPMTD。Lib
マルチスレッド DLL (/MD) MSVCRT。LIB/MSVCPRT。Lib
マルチスレッド /DLL のデバッグ (MDd) MSVCRTD。LIB/MSVCPRTD。Lib

注:

  • 静的シングル スレッド ライブラリの /ML および /MLd ライブラリ コンパイラ オプションは、Visual C++ で削除されました。
  • MSVCPRT.libMSVCPRTD.lib は静的ライブラリであり、それらに直接関連するダイナミック リンク ライブラリ (DLL) はありません。 これらのライブラリは、 それぞれ MSVCRT.libMSVCRTD.lib にも依存します。 MSVCPRT.lib または MSVCPRTD.lib使用するアプリケーションがあり、[既定のライブラリを無視する (/NOD または NODEFAULTLIB)] オプションを使用する場合は、MSVCPRT.lib (または MSVCPRTD.lib) と MSVCRT.lib (または MSVCRTD.lib) をアプリケーションにリンクしてください。 そうしないと、アプリケーションをリンクするときにリンカー エラー (LNK2001: MSVCPRT.lib または MSVCPRTD.lib の未解決の外部) が発生します。 コードで使用するヘッダーによっては、Standard C++ ライブラリのライブラリもリンクされる場合があります。

ヘッダー ファイル use_ansi.h には、 #pragma 標準 C++ ライブラリを強制的にリンクするステートメントが含まれています。 すべての標準 C++ ヘッダーには 、use_ansi.h が含まれます。アプリケーションに Standard C++ ヘッダーを含める場合、標準 C++ ライブラリは既定でリンクされます。

標準 C++ ヘッダー

列 1 列 2 列 3 列 4
アルゴリズム Bitset 複雑 Deque
例外 FSTREAM 機能 IOMANIP
iOS IOSFWD Iostream Istream
反復 子 制限 リスト ロケール
マップ メモリ 数値 OSTREAM
キュー 設定 SSTREAM スタック
STDEXCEPT STREAMBUF STRING STRSTREAM
TYPEINFO ユーティリティ Valarray ベクトル

以前のバージョンからプロジェクトを移植する場合、Visual C++ .NET 2003 以前のバージョンから古い 'iostream' 機能を保持する方法

古い iostream ライブラリ (iostream.h) を保持する場合は、コードに 1 つ以上の古い iostream ヘッダー ファイルを含めます。 新しい Standard C++ ヘッダーは使用しないでください。 古い iostream ライブラリと新しい Standard C++ ライブラリの呼び出しを混在させる必要はありません。

標準 C++ ライブラリをアプリケーションの既定のライブラリにする方法

Standard C++ ライブラリを既定にする場合は、新しい Standard C++ ヘッダーを 1 つ以上含めます。 古い iostream 標準 C++ ライブラリと新しい Standard C++ ライブラリの呼び出しを混在させる必要はありません。 古い iostream 関数を使用する既存のライブラリ (静的または動的リンク) は、Standard C++ ライブラリ iostream 関数を使用するように変更する必要があります。

MFC アプリケーションで Standard C++ ライブラリを使用すると、C ランタイム ライブラリとの競合が発生します

いいえ。 Microsoft Foundation クラス (MFC) では、標準 C++ ライブラリと競合する C ランタイム関数は使用されません。

'iostream' を含めたにもかかわらず、エラー (エラー C2065: ''cout'' : 宣言されていない識別子) が表示される理由

標準 C++ ライブラリは、独自の名前空間 stdに実装されています。 プログラムの先頭に次のステートメントを必ず追加してください。

using namespace std;

または、std::cout各 Standard C++ ライブラリ識別子を名前空間 std(例: ) で修飾します。

エラーが発生する理由 (コンパイラ エラー C2371: 'identifier' 再定義、さまざまな基本型)

Visual C++ 2005 より前のバージョンの Visual C++ では、Standard C++ ヘッダーと古い iostream ヘッダーを混在させると、異なるソース ファイルに含まれている場合でも、このエラーが発生します。 さまざまなヘッダーを次に示します。

  • 古い iostream ヘッダー:

    列 1 列 2
    FSTREAM。H IOMANIP。H
    Ios。H Iostream。H
    Istream。H OSTREAM。H
    STDIOSTR。H STREAMB。H
    STRSTREA。H
  • 標準 C++ ヘッダー:

    列 1 列 2 列 3 列 4
    アルゴリズム Bitset 複雑 Deque
    例外 FSTREAM 機能 IOMANIP
    iOS IOSFWD Iostream Istream
    反復 子 制限 リスト ロケール
    マップ メモリ 数値 OSTREAM
    キュー 設定 SSTREAM スタック
    STDEXCEPT STREAMBUF STRING STRSTREAM
    TYPEINFO ユーティリティ Valarray ベクトル

プロジェクトが既定のライブラリを無視してビルドされている場合にメッセージを受け取る理由 (LNK2001: 'iostream' 関数呼び出しで未解決の外部シンボル 'symbol';)

関数は iostream C ランタイム ライブラリから削除されました。

古い iostream 関数を使用している場合は、別のライブラリ LIBCI.lib (シングル スレッド ML)、 LIBCIMT.lib (マルチスレッド MT)、または MSVCIRT.lib (マルチスレッド dll MD) を追加する必要があります。 これらのライブラリは Visual C++ から削除されました。

Standard C++ ライブラリに含まれる新しい iostream 関数を使用している場合は、別のライブラリ LIBCP.lib (シングル スレッド ML)、 LIBCPMT.lib (マルチスレッド MT)、または MSVCPRT.lib (マルチスレッド dll MD) を追加する必要があります。

異なるバージョンのライブラリを混在させる必要はありません。 たとえば、C ランタイム ライブラリのシングル スレッド バージョンを使用している場合は、古い iostream ライブラリまたは Standard C++ ライブラリのシングル スレッド バージョンも使用する必要があります。

古い iostream ライブラリ関数と新しい Standard C++ ライブラリ iostream 関数の呼び出しを混在させる必要はありません。

コンパイラ警告 C4786 または C4788 が表示される理由 プログラム内のシンボルの長さが 255 文字に近い場所はありません

C4786 または C4788 は、シンボルの名前の長さが 255 文字を超えると発行されます。 この問題は、多くの場合、テンプレート クラスで発生し STL 、テンプレート クラスを広範に使用します。

この警告を無視しても安全です。 メッセージを抑制するには、 #pragma 警告 (無効: 4786,4788) を使用します。

メッセージが表示される理由 (C4530: C++ 例外ハンドラーが使用されていますが、アンワインド セマンティクスは有効になっていません。GX を指定する)

標準 C++ ライブラリを使用するプログラムは、C++ 例外処理を有効にしてコンパイルする必要があります。 C++ 例外処理は、次のいずれかの方法で有効にすることができます。

  • [プロジェクト設定] ダイアログ ボックスの [C/C++] タブの [C++ 言語カテゴリ] で [例外処理を有効にする] オプションを選択します。
  • /GX コンパイラ スイッチの使用。

コンパイラ エラー C2146、C2065、最後に C2143 が発生する理由

この一連のエラーは、次の種類のコンストラクトによって発生する可能性があります。

vector<int, allocator<int>>iV;

この問題は、宣言の最後にある連続 >> したが原因で発生します。 解決策は、2 文字の間にスペースを置くことです。そのため、コンストラクトは次のようになります。

vector<int, allocator<int> > iV;

これは、提案された ANSII 仕様と一致します。