WisdomSoft - for your serial experiences.

C言語の機能

C++ 言語は C 言語と多くの部分で互換性があり、C 言語のソースファイルを C++ 言語としてコンパイルしても、ほとんどの場合は問題ありません。

Cの関数を使う

C++ 言語は前進となった C 言語と互換性があり、C 言語で書かれたプログラムの大部分は C++ 言語としてもコンパイルできます。これは C++ 言語が C 言語の文法を踏襲し、新しい文法を追加した仕様になっているためです。本書で解説する対象は C++ 言語ですが、基本的な文法の多くは C 言語でも共通しています。

多くの C++ コンパイラは C コンパイラの機能も兼ねています。Visual Studio ではソースファイルの拡張子が cpp であれば C++ 言語のソースファイルと解釈し、c であれば C 言語のソースファイルだと解釈します。Visual Studio の項目には「C++ ファイル(.cpp)」しか存在しませんが、ファイル名の拡張子を .c に変更すれば、自動的に C 言語のソースファイルとしてコンパイルされます。

1 C言語のソースとC++言語のソース
図1 C言語のソースとC++言語のソース

同一のプロジェクト内で C 言語のソースと C++ 言語のソースを混在させることも可能です。C 言語で書かれた既存のプログラムを C++ 言語のプロジェクトで利用することも難しくはありません。

文法と同じように C++ 言語は C 言語で標準に備えられていた機能に加えて、C++ 固有の新しい機能を追加しています。例えば「最初のプログラム コード2」でテキストを出力するために std::cout と記述しましたが、これは 標準 C++ で追加された新しい機能の 1 つです。当然 C 言語で使うことはできません。C 言語でテキストを画面に表示するには printf() 関数を使っていました。

printf() 関数を利用するには、先に stdio.h ファイルをインクルードしなければなりません。

コード1
#include <stdio.h>

int main()
{
	printf("Stand by Ready!!\n");
	return 0;
}
実行結果
コード1 実行結果

コード1は「最初のプログラム コード2」と同じ結果ですが std::cout ではなく printf() 関数を使ってテキストを出力しています。C 言語の入門書では、最初にテキストを出力するプログラムとしてコード1のように printf() 関数を使っています。

コード1は C 言語としてもコンパイルすることができ、C++ 言語としてもコンパイルできます。コード1の形で問題はないのですが標準 C++ に準拠した形で printf() 関数を使いたい場合は stdio.h ではなく cstdio をインクルードします。

C 言語では stdio.h のように、標準で提供されるヘッダファイルの拡張子は h でした。しかし C++ 言語では標準で提供されるヘッダファイルには iostream や cstdio のように拡張子が付いていません。しかし、C++ 言語にも歴史的な経緯があり、標準 C++ が定められる前の古い環境では拡張子付きの iostream.h が使われていました。古い環境や書籍では iostream.h をインクルードしているコードがありますが、これは古い書き方なので注意してください。現在では iostream をインクルードします。

コード2
#include <cstdio>

int main()
{
	printf("Stand by Ready!!\n");
	return 0;
}
実行結果
コード2 実行結果

コード2コード1と同じ内容ですが、インクルードしているファイルが標準 C++ に従って cstdio になっています。標準 C++ に準拠したコードとして printf() 関数を使いたい場合は stdio.h ではなく cstdio をインクルードするべきです。

他の C 言語用のヘッダファイルも同様の命名規則で提供されています。ヘッダファイル名の先頭に c を付け加え、拡張子を取り除いたものが C++ 言語用のヘッダファイルです。本書は C++ 言語の解説書なので printf() 関数など C 言語の標準関数については割愛します。