この記事では、Standard C++ ライブラリに関してよく寄せられる質問 (FAQ) とその質問に対する回答の一覧を示します。
元の製品バージョン: Visual C++
元の KB 番号: 154419
Standard C++ ライブラリに含まれる内容
Standard C++ ライブラリは拡張可能なフレームワークを提供し、言語サポート、診断、一般的なユーティリティ、文字列、ロケール、標準テンプレート ライブラリ (コンテナー、反復子、アルゴリズム、数値)、および入出力用のコンポーネントが含まれています。
Standard C++ ライブラリは、次のカテゴリに分けることができます。
標準テンプレート ライブラリ (STL) コンポーネントは、最も広く使用されているアルゴリズムとデータ構造のサブセットにアクセスできる C++ プログラムを提供します。 STL ヘッダーは、次の 3 つの主要な編成概念にグループ化できます。
コンテナー: 、 などの
vector
stack
deque
queue
list
set
データを整理するための一般的な方法をサポートするmap
テンプレート クラス。アルゴリズム: 関数、アルゴリズム、数値など、オブジェクトのシーケンスに対して一般的な操作を実行するためのテンプレート関数。
反復子: ユーティリティ、反復子、メモリなど、アルゴリズムとコンテナーを一緒に貼り付ける接着。
入力/出力には、(
iosfwd
)、定義済みiostreams
オブジェクト ()、基本iostreams
クラス (iostream
)、ストリーム バッファリング (ios
streambuf
)、ストリームの書式設定とマニピュレーター (、、)、文字列ストリーム (iosmanip
)、ostream
istream
およびファイル ストリーム (fstream
sstream
) の前方宣言iostreams
用のコンポーネントが含まれています。その他の標準 C++ ヘッダーは次のとおりです。
言語のサポート: ライブラリ全体で使用される一般的な型定義 (
cstddef
)、定義済み型 (limits
、、) の特性、C++ プログラムの開始と終了をサポートする関数 ()、climits
cfloat
動的メモリ管理 (cstdlib
)、動的型識別のnew
サポート ()、例外処理のtypeinfo
サポート (exception
)、その他のランタイム サポート (cstdarg
、、、ctime
csetlmp
csignal
)。診断: いくつかの種類の例外条件 ()、プログラム アサーションの文書化 (
stdexcept
)、およびエラー番号コードのグローバル変数 (cassert
cerrno
) を報告するためのコンポーネント。文字列: 文字列クラス (
string
) および null で終わるシーケンス ユーティリティ (cctype
、、cwctype
cwchar
) のコンポーネント。ローカライズ: C++ プログラムがカルチャの違いをカプセル化するために使用できるコンポーネント。 ロケール機能には、文字分類と文字列の照合順序、数値、通貨、日付/時刻の書式設定と解析、メッセージ取得 (
locale
、clocale
) の国際化サポートが含まれています。
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.lib と MSVCPRTD.lib は静的ライブラリであり、それらに直接関連するダイナミック リンク ライブラリ (DLL) はありません。 これらのライブラリは、 それぞれ MSVCRT.lib と MSVCRTD.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 仕様と一致します。