2013年8月11日日曜日

関数プロトタイプ宣言

プロトタイプ宣言とは、関数の処理内容を定義する前に、関数の呼び出し方法をあらかじめ
記述しておくことです。C++では、関数呼び出しの前に関数の定義がない場合に必ず
プロトタイプ宣言をしなければなりません。

OKパターン
ソースコードが関数の定義⇛関数呼び出しの順に記述

NGパターン
ソースコードが関数呼び出し⇛関数の定義の順に記述

しかしプロトタイプ宣言を書けばOKに
プロトタイプ宣言⇛関数呼び出し⇛関数の定義

具体的にはこのようになります。^^
プロトタイプ宣言があれば、ソースコードが見やすくなりますね(^^)

    :
int AddNumber(int, int);    //プロトタイプ宣言

int main(void)
{
    int a = AddNumber(5, 10);  //関数呼び出し

    return 0;
}

int AddNumber(int number1, int number2)    //関数の定義
{
    return number1 + number2;
}
    :


Cのプロトタイプ宣言と違うところ
Cでは「不明な関数は int型を返す」という暗黙のルールがありました。
そのためプロトタイプ宣言がなくてもコンパイルエラーにならない場合もあります。
しかしC++では不明な関数があると必ずコンパイルエラーです。厳しいですね(^_^;)

//プロトタイプ宣言なし
int main(void)
{
    int a = AddNumber(5, 10);  //関数呼び出し

    return 0;
}

int AddNumber(int number1, int number2)    //関数の定義
{
    return number1 + number2;
}

上記プログラムではエラーメッセージが出ましたの例
test.cpp: In function ‘int main()’:
test.cpp:7:28: error: ‘AddNumber’ was not declared in this scope

 
変数名を含めた関数プロトタイプ宣言
 ちなみに、引数を記述するところは型だけでなく変数名も一緒に記述できます。
 変数名がある方が、引数の意味が分かりやすいので記述することをオススメします(^^)

 //関数の定義の部分をそのままプロトタイプ宣言に使用する例
         :
 int AddNumber(int number1, int number2);  

 int main(void)
 {
     int a = AddNumber(5, 10);
   
  return 0;
}

int AddNumber(int number1, int number2)
{
        :



 注意
 プロトタイプ宣言をしていないCのプログラムをC++でコンパイルする場合は
 プロトタイプ宣言を追加してくださいね。
 そもそも混ぜて使うなという話もありますが、つまらない所でハマります(^_^;)


今日の名言
ほんの少しばかり勇気に欠けていたために、多くの才能ある人々が一生功を成すことなく
終わっている。思い切って着手する勇気がなかったために一生無名に終わった、大勢の人間が
毎日墓場へ送られる。こうした人々も実行に取り掛かる決断さえついていれば、おそらく名声を
上げていただろう。もし人に認められるようなことを行いたければ、寒さや危険を恐れて、ぼんやりと
立ちすくんでいてはダメだ。思い切って飛び込んで全力を尽くして泳ぎ渡れ!これが冷厳な現実で
ある。絶えず危険を見積もって、小手先の調整ばかりしていてはダメだ。万事大らかだったノアの
大洪水以前なら、150年後の事業のことで友人に相談し、そのせいかを見届けるまで長生きする
ことができたであろう。だがこの忙しい現代では、仕事の着手を手控えて思い迷い、あれやこれやと
人に相談ばかりしていては、いつの間にか60歳を迎え、せっかく兄弟や親類や友人の助言に従おう
としても、もはやその時間はなくなってしまう。
                                          シドニー・スミス

勇気はまさに人間に必要な第一の特質である。
これが備われば、他の特質も自然に備わってくるからだ。
                                          ウィンストン・チーチャル

追い詰められた若者が意を決して、「世間」という暴れん坊のあごひげを引っ張ると、すっぽりと
手の中に抜け落ちることがある。よく見直すと、それは臆病者を追い払うためのつけヒゲなのだ。
                                          ラルフ・ワルド・エマーソン