[前へ]   [目次へ]   [次へ]

実際に作成する前に(C/C++)


そろそろ実際にプログラムを組みながら進行していこうと思いますが、
その前にいくつか必要な項目があるので今回はそれを書こうと思います。

まず最初に、この講座で使用する言語仕様は、ANSI C(C90)およびANSI C++を主にする予定です。

次に、拡張子についてです。(拡張子自体については1章「拡張子」を参照してください)

C/C++言語は見た目がよく似ていて、どちらの言語で書いてあるかを特定できないため、
大抵のコンパイラは拡張子を使ってどちらの言語かを判断します。

C言語の場合は「c」を使い、
C++言語の場合には・・・何故か複数ありますが「cpp」や「cc」、「cxx」などがあります。

記述した言語に合わせた拡張子をつけないと、正しく認識されない可能性があるので注意してください。

C++言語においてより良い手法が出ている場合には、そちら側を優先し、C言語の手法は併記に留めるつもりですが、
当分はC言語ベースの解説の予定ですので、作ったプログラムや、サンプルプログラムには
「c」の拡張子を付けてください。

基本的にはC++言語はC言語にいろいろ付け加えたものなので、
ある程度気をつけて書いていれば、C言語のソースはそのままC++言語に持ち込むことも可能です。

ただし、C言語用の雛形とC++言語用の雛形は若干異なっているので、この部分の修正は必要になります。
この部分にさえ気をつければ、C++でエラーになるようなコードは書かないつもりですので、
C++言語用の拡張子で作っても構いませんし、その方がC++言語を混ぜた時に楽かもしれません。

この辺は人によって異なるようですが、
C++言語からC言語のライブラリを呼び出すことはよくないという話もあります。
ただ、私的にはC++言語でC言語のライブラリ呼んだっていいじゃないか派なので、
私のC++ソースはC言語のライブラリ使いまくりです。
C++使った方が楽だと思ったところだけC++の機能を使っています。
特に入出力の辺りはC++だと識別子がやたら長いのがイヤなのでC言語メインだったり

以下にC言語用、C++言語用それぞれの雛形を書いておきます。
以前書いたものはC言語用になります。

C言語用の雛形
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
#include <stdio.h>

int main(void)
{
   
//ここにプログラムを書きます。
   
return 0;

C++言語用の雛形
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
#include <cstdio>
using namespace std;

int main()
{
   
//ここにプログラムを書きます。
   
return 0;
・・・と、なるはずなんですが・・・C++用、VC6でコンパイルできません(汗)
やろうとすると「2行目:'std':存在しないか名前空間名ではない」といった意味のことを言われます。
ネット上で検索すると、「規格上は上の例で正しい」はずなのですが、コンパイラによってはそうなってない・・・と。


さて、上の2つの相違点ですが・・・
1行目の #include <stdio.h> と #include <cstdio> は、
読み込むファイル名が違いますが、意味的にはほぼ同じことが書いてあります。
C++ではC言語用の標準ライブラリの名前の最後の.hを取って先頭にcを加えることになったためです。
注1:なお、普通C++ではここはiostreamを入れるもんですが、それだけだとprintfとか使えないんで・・・
注2:VC6だとiostream読み込んだだけでもprintf使えたりしますが、必ずそうなる保証もない(はず)です。



2行目に追加された using namespace std; は、
C++言語ではC言語の標準ライブラリは std という名前空間に入っていることになっていて、
名前空間指定をしないと呼び出すことができないことになっています。
この行は名前空間指定なしでも呼べるようにする指定です。
注1:名前空間(namespace)はC++の追加機能です。
注2:VC6ではC言語の標準ライブラリがstd名前空間に入っていません。
     大抵この指定を書くからそもそも書く手間を省くためなのかもしれませんが(笑)
     VC6ではこの行を消せばコンパイルできます。



C側3行目、C++側4行目の int main(void) と int main() は、
単にC++で関数宣言時()を空にした時に void として扱われるようになっただけで、同じ意味です。
別にC++側で void を書いても同じですが、空にした時の扱いはC言語とC++言語で異なるので注意してください。


ここまで書いてきたこれらは「コンソールアプリケーション」用で、
ANSI準拠や、互換のコンパイラならまずたいした問題なくコンパイルできるはずです。

よくある「Windowsアプリケーション」をコンパイラが作成可能かを調べるには・・・
とりあえず #include <cstdio> に続いて次の行に #include <windows.h> を記述してコンパイルできれば多分いけると思います。
逆に、これで「ファイルが見つからない」みたいなエラーが出たら厳しいと思います。


最後に、最適化についてです。
C/C++のコンパイラは普通「最適化」という作業を行います。
最適化は、プログラムの無駄な部分や、よりよく変更できることが確実な場合に、
自動的にコードを書き換えるもので、実行速度の向上や実行ファイルのサイズの縮小等の効果が得られます。

通常は気にする必要はありませんが、速度を計測したりする場合には、
注意していないと検証用のコード(特に無意味に計算させたりするタイプ)が
全部消されたりして計測できないことがあるので、
そういう場合は一時的に最適化を無効にするなどの作業が必要です。

[前へ]   [目次へ]   [次へ]

プログラミング講座 総合目次

最終更新 2008/10/17