【C++初心者必見】C++ライブラリの使い方について徹底開設!
はじめまして、エンジニアスタイル編集部です!
コラムページでは、ITフリーランスに向けてお役立ち情報を発信します。Twitterではホットな案件を紹介してまいりますので、ぜひフォローをお願いいたします!
本記事が、皆様の参考になれば幸いです。
経験がまだ少ない方にもわかりやすく説明するために、初歩的な内容も記載しております。記事も長いので、実務経験豊富な方は、ぜひ目次から関心のある項目を選択してください。
エンジニアスタイルは、最高単価390万円、国内最大級のITフリーランス・副業案件検索サービスです。C++のフリーランス・副業案件一覧を以下からご覧いただけますのであわせてご確認ください。
目次
ライブラリとは
ライブラリとは、あらかじめプログラミングの処理で使われそうな、汎用的な処理が詰め込まれたファイルのことです。サブルーチンや関数など、あると便利なプログラムを多く集め、ひとまとまりにしたものを指します。ライブラリにはプログラムの部品が整っているため、一からプログラミングする必要がなく、処理をスムーズに書くことが可能です。
たとえば、「データベースに接続する処理」「ファイルの存在チェック処理」「ログの出力処理」などが挙げられます。ライブラリはプログラムにおける部品の役割を担うため、それだけでは単体のプログラムとして動くことはありません。あくまでも実行可能ファイルに連携して利用されるものであるため、プログラミングにおけるサポート役と認識しておきましょう。
C++におけるライブラリ
C++とは、プログラミング言語のひとつです。C++におけるライブラリの種類には、標準ライブラリと外部ライブラリがあります。下記で見ていきましょう。
標準ライブラリ
C++における標準ライブラリに含まれるものとして、主に次の6つが挙げられます。
- 文字列クラス
- 数値クラス
- 標準バージョンのストリーム入出力クラス
- 基本的なメモリー割り当て
- 例外クラス
- 実行時型情報
下記で詳しく解説します。
文字列クラス
C++において標準で使用できるライブラリのひとつに、文字列をより安全・便利に使用できる「文字列クラス」があります。文字列クラス「std::string」を使用するためには、<string> という標準ヘッダをインクルードすることが必要です。std::stringクラスを用いることで、string型(文字列型)の宣言や文字列の長の取得、文字の挿入削除などが容易になります。
C/C++ はもともと、ダブルクォートで文字列リテラルを表し、通常配列に文字を格納することで加工できる言語です。strlen() の文字列の状態を返すことや、sprintf() の文字列を作成する関数などが用意されています。一方で、リテラル文字列に対しては動的な操作に不向きのため、柔軟性に欠けることが欠点でした。そこでC++には、動的にサイズ変更が可能な文字列クラスとして「std::string」が導入されたという背景があります。
数値クラス
C++における数値クラスとは、規定の値の型を指し、簡単にいうと関数や変数の詰め合わせのことです。数値クラスは、符号付きで10を基数とする数値を処理するクラスで、精度に制限があることが特徴です。
数値クラスでは、10進数38桁の精度が保証されています。数値ゼロを正確に表現することが可能であり、Oracle NUMBERでは正の無限大と負の無限大を表現できることも特徴です。一般的に、これらの数値表現はオーバーフローを示すために使用されます。
数値クラスから呼び出すオブジェクトは、クライアント側で数値計算をする際にスタンドアロン・クラス・オブジェクトとして使用可能です。データベースに設定する場合やデータベースからフェッチする場合にも使用できます。
標準バージョンのストリーム入出力クラス
C++の標準ライブラリには、ストリーム入出力クラスが組み込まれています。C言語における「stdin」「stdout」「stderr」という定義と同じものです。一般的なC++コンパイラ(現在のANSI/ISO規格)であれば、入出力ストリームライブラリのクラスライブラリ(在来型入出力ストリーム)が組み込まれています。
標準入出力ストリームは使用頻度が高いインターフェースとして維持されているため、在来型入出力ストリームと互換性があることも特徴です。標準入出力ストリームでできることとしては、在来型入出力ストリームのライブラリとの対比や、標準Cライブラリの入出力と対比することが挙げられます。
基本的なメモリー割り当て
C++では、配列を利用する際に必要となるデータをある程度見積り、それよりも大きいサイズの配列を宣言することが一般的です。しかし、プログラムを実行している最中に、予想よりも大きいデータが必要となった場合に、配列のサイズを再度拡大する必要が出てきます。すべてのデータが格納できなくなることを防ぐために、メモリのサイズを動的に割り当てる場合や、拡大する場合があります。
近年ではJavaやC#などの言語において、メモリの扱いを気にしなくて良い環境が主流となっているため、メモリ管理の存在そのものを知らない人も多いことでしょう。まず前提として、C++では自前でメモリを管理する必要があります。
メモリ管理では、OSなどがメモリをすべて保持しているため、ユーザーは必要に応じてシステムに問い合わせ、メモリを確保する作業が必要です。一方で、メモリが不要になったらシステムに返す作業も発生します。この作業を「メモリの確保・割り当て」と「解放」などと呼ぶことが一般的です。
C++のプログラムでは、メモリ確保命令に「new」を、newで確保したメモリ領域を開放する命令に「delete」を、newで確保した配列に対して解放する命令で「delete[]」を使用します。
例外クラス
C++の標準ライブラリには、例外オブジェクトに使うためのクラスが複数定義されており、これを例外クラスといいます。すべての例外クラスは、std名前空間に含まれているのが特徴です。しかし、すべての例外クラスはstd名前空間に含まれていますが、インクルードする標準ヘッダは同じではありません。
そのため、継承構造になっていることで、基底クラス型を指定して例外を捕捉しようとすれば、その派生クラスの型の例外オブジェクトでも捕捉できる仕組みとなっています。もし捕捉後の処理を細かく制御したいという例外内容の場合、まず派生クラス型で受け取ります。大体同一のカテゴリが存在するなら、同じ処理で良いのであれば、基底クラス型で受け取るという選択が可能です。
また、標準ライブラリで定義されている例外クラスから、新たな派生クラスを定義して使用することも可能となっています。
実行時型情報
C++の特徴ともいえるオブジェクト指向の言語では、ポリモーフィズムをサポートしています。場合によっては、実行されるまで性質が判別できないオブジェクトが存在し、プログラムの効率に非常に大きな影響を与えるのが特徴です。しかし、実行中に現在のオブジェクトの型を知る必要があるケースも考えられます。
コンパイル時にオーバーライドされた仮想関数の型を知ることはできないため、「実行時型情報」という機能を用いることで実行中に型を調べる必要があります。実行時型情報は、RTTI(Run-Time Type Identification) とも呼ばれているので覚えておきましょう。
実行時型情報の機能を用いることで、ポリモーフィッククラスの型の操作を動的に実行できます。また、実行時型情報を得るためには「typeid演算子」を使用します。ypeid演算子は「const type_info &」を返し「type_infoクラス」を使用するには <typeinfo> ヘッダをインクルードします。
外部ライブラリ
C++には、標準ライブラリ以外にも、外部ライブラリと呼ばれるものがあります。外部ライブラリとは、プログラミング言語の処理系に標準では付属しないライブラリのことです。外部ライブラリの中には、部品化されたプログラムが収録されています。外部ライブラリを使用するには、開発者が個別に部品化されたプログラムを取り寄せて、導入する必要があります。本記事では主に次の2つのライブラリについてみていきましょう。
- Windows アプリケーション用のライブラリ
- その他のライブラリ
下記で詳しく解説します。
Windows アプリケーション用のライブラリ
C++における外部ライブラリの1つ目は、Windowsアプリケーション用のライブラリで、たとえばMFC/ATLラッパーライブラリがあります。
Microsoft Foundation Classes (MFC) は、ネイティブデスクトップアプリケーションの迅速な開発が可能であり、Win32におけるC++オブジェクト指向ラッパーを提供します。Active Template Library (ATL) は、ActiveXコントロールを作成するためによく使用されるもので、COM 開発を簡単にするラッパーライブラリです。
MFCやATLプログラムでは、Visual Studio Communityエディションか、それ以上のエディションで作成できます。Express Editionは、MFCやATLのサポート対象外なので注意しましょう。
その他のライブラリ
C++の外部ライブラリの中には、前述してきたようなもの以外にも「その他のライブラリ」があります。たとえば、「Tools.h++ライブラリ」や「Sun WorkShop Memory Monitorライブラリ」が外部ライブラリとして含まれています。
Tools.h++は、RogueWaveのC++基礎クラスライブラリです。汎用性に優れており、機能が豊富で強力なC++基本クラスライブラリとして知られています。Tools.h++のソフトウェアパーツセットを利用することで、実質的にどのようなアプリケーションでも作成できるすぐれものです。
Tools.h++は業界標準のライブラリであるため、多種多様なコンパイラベンダの製品に使用されています。数多くのコンパイラやオペレーティングシステムに移植されているとともに、世界中の利用者から愛されていることが特徴です。また、ほぼすべての開発プラットフォームで使用できるのも強みといえるでしょう。
Sun WorkShop Memory Monitorライブラリは、メモリやメモリリークの断片化や、メモリが早期開放する問題を自動で検知・報告し、解決してくれる機能が特徴です。Sun WorkShop Memory Monitor には、「デバッグ」「実装」「ガベージコレクション」という3 つの操作モードがあります。
C++のビルドの仕組み
C++を用いて大規模なアプリなどを開発する場合は、ビルドを理解することが必要不可欠です。ビルド(build)とは、ヘッダ・ソースコードから最終的に実行ファイルを作り出す仕組みのことを指します。実行ファイルとは、たとえばWindowsにおける「exe」の拡張子がついたものです。
ビルドを理解するには、そのプロセスを把握する必要があります。ビルドは次の3つの手順で実行されることを把握しましょう。
- プリプロセス(プリプロセッサを実行)
- コンパイル(コンパイラで実行)
- リンク
下記で詳しく解説します。
プリプロセッサ
C++のビルドにおけるプリプロセスとは、コンパイル前に行われる前処理のことです。コメントの削除と「プリプロセッサ司令」を実行します。プリプロセッサを使用することで、以下の項目をおこなうことが可能です。
- コードの条件付きコンパイル
- ファイルの挿入
- コンパイル時のエラーメッセージ指定
- コード セクションへのコンピューター固有の規則適用
条件付きコンパイルは、プリプロセッサによってコードをコンパイルの対象とするか除外するかを選択する仕組みです。例えば、デバッグ時にコンパイルしたいコードと、リリース時にコンパイルしたいコードを、プリプロセッサディレクティブで分岐できます。また、#include命令を検知し、ファイル名で示されたファイルの中身をその部分に挿入することも可能です。
他にも、C++には#error ディレクティブがあり、コンパイル時にユーザー指定のエラーメッセージを出力して、コンパイルを終了します。セクションへのコンピューター固有の規則適用は、Microsoft 固有の__thiscall 呼び出し規則として、x86 アーキテクチャ上の C++クラス メンバー関数で使用されます。
コンパイラ
C++のビルドプロセスにおける「コンパイル」とは、実行者(人)が扱うソースファイルを、コンピュータで扱うために0と1だけの機械語に変換することです。コンパイルはソースファイル単位でおこなわれます。厳密には、コンパイルを実行するプログラムのことを「コンパイラ」と呼びますが、コンパイル以外のビルド処理もコンパイラによって提供されるのが一般的です。また、ソースファイルを機械語に変換した結果のファイルのことを「オブジェクトファイル」と呼びます。
C++のコンパイル手順は、以下の通りです。
- C++のプリプロセッサによって各ソースファイル内におけるすべての「#ディレクティブとマクロの定義」が変換される。また、変換されることにより「翻訳単位」が作成される。
- C++のコンパイラによって、上記手順で作成された各翻訳単位がオブジェクトファイル (.obj) にコンパイルされる。このとき、設定されているすべてのコンパイラオプションが適用される。
- 「リンカー」によって、オブジェクトファイルが単一の実行可能ファイルにマージされる。このとき、設定されているリンカーオプションが適用される。
翻訳単位とは、1つのソースファイルと、インクルードされるヘッダファイルなどの各ファイルを加えたものに、プリプロセスの処理を実施した状態のものです。最終的な実行可能ファイルを得るためには、各翻訳単位に対してコンパイルをおこないます。このとき、1つ1つの翻訳単位を別個にコンパイルするのが特徴。ソースファイルに対応したオブジェクトファイルを生成し、リンカによって1つに統合(リンク)する方法を採ることが一般的です。
まとめ
本記事では、C++ライブラリの種類・概要や、使い方について紹介しました。C++ライブラリは標準ライブラリと外部ライブラリに分けられます。他にも、C++を用いて大規模なアプリなどを開発する場合に覚えておくべき、ビルドの手順も解説しました。
プログラミング言語を駆使してアプリなどの開発をおこなうためには、ライブラリの活用が必要不可欠です。できるだけスピーディーに、手間をかけずに開発できるよう、各ライブラリの特徴や使用場面を理解しておくといいでしょう。
- CATEGORY
- 学習
- TAGS
-
-
-
-
-
-
-
【Python(機械学習・AI系)】音声処理または機械学習エンジニアの 求人・案件
- 700,000 円/月〜
-
番町・麹町・永田町
- Python
-
【Python(Web開発系)】ブロックチェーンゲームサーバサイドエンジニア(Python/Go)の 求人・案件
- 650,000 円/月〜
-
その他
- Python Go言語 Java JavaScript Nodejs
-
【Python(Web開発系)】基地局管理システムの機能改修の 求人・案件
- 650,000 円/月〜
-
その他
- Python Perl SQL
-
Ruby/物流向けSaaSプロダクトのバックエンド開発/フルリモートの 求人・案件
- 900,000 円/月〜
-
その他
- Ruby
-
Java/証券 システム再構築フェーズ2(債券売買)対応の 求人・案件
- 750,000 円/月〜
-
その他
- Java SQL
-
【C言語】車載系カメラ機能開発案件の 求人・案件
- 700,000 円/月〜
-
六本木・広尾・麻布十番
- C言語
-
【PL】製造小売業向けSCMシステム移行展開案件の 求人・案件
- 1,250,000 円/月〜
-
秋葉原・神田
-
【PHP】不動産管理サイト向けシステム開発案件の 求人・案件
- 850,000 円/月〜
-
新宿
- PHP TypeScript
-
【進行管理ディレクション】スポーツ関連Webサイトディレクション案件の 求人・案件
- 550,000 円/月〜
-
新橋・汐留
-
【PM】アパレルブランド向けPJ推進案件の 求人・案件
- 1,200,000 円/月〜
-
その他
-
【UIデザイン】不動産会社向け検索ポータルリニューアル案件の 求人・案件
- 750,000 円/月〜
-
その他
-
【IT講師/Java/フルリモート】人材業界向けIT講師案件の 求人・案件
- 要相談
-
その他
- Java
-
【リモート/PHP】国内最大規模のライブ配信サービスにおける新規機能開発、改修等の 求人・案件
- 900,000 円/月〜
-
その他
- PHP JavaScript SQL HTML TypeScript
-
【リモート/TypeScript】技術本部/プロダクト開発部エンジニアリングマネージャーの 求人・案件
- 1,000,000 円/月〜
-
その他
- TypeScript Python JavaScript Nodejs
-
【Java】B2B向けSaaSサービスの開発支援 のエンジニア求人・案件の 求人・案件
- 960,000 円/月〜
-
その他
- Java
-
【Java/フルリモート】エネルギー事業向けシステム開発案件の 求人・案件
- 550,000 円/月〜
-
その他
- Java SQL
-
【Java】WEB予約サイト開発支援案件の 求人・案件
- 650,000 円/月〜
-
その他
- Java
-
【進行管理ディレクション】ビューティー&ヘルス事業向けWebディレクション案件の 求人・案件
- 800,000 円/月〜
-
その他