無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

Cを少し強くつつく1ーコンパイラに教えてあげよう♪

引き続き前回のサンプルコードをつついていくピヨ♪このサンプルで先ず最初に気になるのが・・・

int printf(const char *, ...);

だよね。これは一体なんだろう?こういった疑問が生じた時は消しちゃえ!そうすれば、コンパイラが文句を言ってくるはずだっピヨ。じゃあ、やってみよう♪


int main(void)
{
    printf ( "ピヨッと学習開始♪" );
    return 0;
}


何を言ってくるかな♪何を言ってくるかな♪・・・・・・あれ???何も言って来ないピヨ。本当に問題なのかな?警告をON(Wallコンパイラオプションを追加)にしてコンパイルしてみたピヨ。


cl /TC /Wall サンプルコードのファイル名
HelloWorld1.c(3) : warning C4013: 関数 'printf' は定義されていません。int 型の値を返す外部関数と見なします。


ちょっと難しいピヨね。VCちゃんが言っている事を簡潔に表現すると「printfなんて知らないわ。仕方が無いからどこかに定義されていると看做すわ。」という事なんだ。今回のサンプルはちゃんと動いているようだけど、それは偶然であって決していい事ではないピヨ。それは何故かと言うと、バグ(間違い)が混入する可能性が非常に高まるからなんだ。こんなふうに・・・


int main(void)
{
    printf ( 96 );
    return 0;
}


きっと、くぅーと言おうとしたんだろうね。だけどコンパイルして実行してごらん。エラーになるよね。こんな風に人間の間違いがチェックされないんだ。今回のプログラムは短いからこれでいいけど、長いプログラムでバグが発生すると凄く大変だよ。デスマーチがきっとやってくるピヨ。そんなの嫌だよね?という事で、消したプログラム(int printf(const char *, ...);)を再び戻してみよう♪そしたら・・・


HelloWorld.c(4) : warning C4047: '関数' : 間接参照のレベルが 'const char *' と 'int' で異なっています。
HelloWorld.c(4) : warning C4024: 'printf' : の型が 1 の仮引数および実引数と異なります。


これで間違えずに済むピヨ♪つまり先ほどのプログラムは、コンパイラに対して使用する関数の定義を教えるためのものなんだ。これを関数プロトタイプ(function prototype)と呼ぶピヨ♪覚えてね♪ 因みに、Cは落とし穴が沢山あるから警告はONにしておく方がいいピヨ。
お疲れ♪もう疲れたと思うから続きは次回書くピヨ♪お楽しみに♪
別窓 | C | コメント:0 | トラックバック:0 | ∧top | under∨
<<書籍をつつく99−図解でわかる Linuxサーバ構築・設定のすべて。思考法を学べ!。 | 無差別に技術をついばむ鳥 | 中の人の徒然草166>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |