第3章 非常識を試す
2006年8月2日
いままでは教科書どおりのコーディングに沿っていろいろ試してみたわけだが、本章ではちょっと趣向を変えてあまり目にすることの無いコーディングを試してみた。(つまり意味が無い)
次のプログラムは、C言語の自由表記の部分を強調する意味で書いたものである。
/*
Title
:List.000-009
Filename:"header.h"
*/
//関数のプロトタイプ宣言-------------------------------------
int F(int); |
/*
Title
:List.000-009
Filename:"main.cpp"
*/
//インクルード---------------------------------------------
#include <stdio.h>
#include "header.h"
int main(void){int answer=0;answer=F(3);printf("Answer=%d\n",answer);return 0;} |
/*
Title
:List.000-009
Filename:"function.cpp"
*/
//F(x)=7x+5---------------------------------------------
int F(int x){return 7*x+5;} |
| ソースのダウンロード |
もちろんこれはビルドに成功する。
おそらく、普段コンパイラは不要なスペースやタブ、改行を無視して文法解析を行っているはずだから、上のソースは本来あるべき形をとっていると云えよう。(?)
ただ、読みにくいのは見てのとおり。
見易くする工夫は個々人のセンスまかせで一向に構わないと思うので、多くの先人が書かれたソースを参考に精進していこうと思う。
ただし全角スペースは無視してくれなくて、コンパイラが怒り出すから注意が必要だ。
次はちょっと特殊なケース。
/*
Title
:List.000-010
Filename:"main.cpp"
*/
int main( int x)
return 5* x+ 7; |
| ソースのダウンロード |
以前、"{}"の後に";"を付けるか付けないかで混乱していた時期があった。
まぁ、間の抜けた話な訳だが、あることを教えてもらって納得できたことがある。
例えば、
for( int i= 0; 10> i; i++)
foge();
と、関数foge()を10回繰り返してみる。
しかして、関数muge()も一緒に繰り返したいときは、
for( int i=0; 10> i; i++)
{
foge();
muge();
}
と、こうなるわけだ。
これを仮に・・・
for( int i=0; 10> i; i++)
{
foge();
muge();
};
と書いたとすると、関数foge()だけの場合、
for( int i= 0; 10> i; i++)
foge();;
と書くのと同意になってしまうと云うわけ。
なるほど、"{}"はあくまでまとめる為に使うものなのだ。
因みに、構造体の宣言などに使う"{}"の後ろに";"がいるのは、それが宣言と云う文章としてそこで終わっているからとのこと。
では、関数の宣言のときに文がひとつしかなければ"{}"でくくる必要も無いんじゃないのかな?と、思って書いたソースが上記のものである。
で、長い説明のあとで申し訳ないが結果は・・・
NGである。
理由が良く判らないのが情けないことだが、おそらくプロトタイプ宣言を書き損なって";"を付け忘れる人(つまり私)の為にそうなっているんじゃないかなぁ、とか思う。
コンパイラのかえすエラーを見て、そんな感じがした。
気をとりなおして、次はインクルードに関してのテスト。
/*
Title
:List.000-011
Filename:"main.cpp"
*/
//インクルード---------------------------------------------
#include <stdio.h>
int F( int); //プロトタイプ宣言
//エントリーポイント-----------------------------------------
int main(void)
{
int answer=0;
answer=F(3);
printf("Answer=%d\n",answer);
return 0;
} |
/*
Title
:List.000-011
Filename:"function.cpp"
*/
//F(x)=7x+5---------------------------------------------
int F( int x)
{
return 7* x+ 5;
} |
| ソースのダウンロード |
前章で、インクルードはマクロ展開のようなもの、と書いたわけだが、その仮説が正しければ上のソースはビルドできるはずである。
結論は・・・
やはりうまくビルドできた。
なんとなく嬉しい。
意味の無いソースではあるけれども。
当たり前のこととはいえ、リンクはリンカの仕事として立派に(?)独立しているようだ。
それを踏まえた上で、次の実験をしてみる。
/*
Title :List.000-012
Filename:"header.h"
*/
//関数のプロトタイプ宣言-------------------------------------
int F( int); |
/*
Title :List.000-012
Filename:"main.cpp"
*/
//インクルードファイル---------------------------------------
#include <stdio.h>
#include "header.h"
//エントリーポイント-----------------------------------------
int main( void)
{
int answer_f= 0,
answer_e;
answer_f= F( 3);
answer_e= E( 3);
printf( "Answer_F= %d\n", answer_f);
printf( "Answer_E= %d\n", answer_e);
return 0;
} |
/*
Title :List.000-012
Filename:"function.cpp"
*/
//F(x)=7x+5---------------------------------------------
int F( int x)
{
return 7* x+ 5;
}
//E(x)=8x^2+2;
int E( int x)
{
return 8*x^2+2;
} |
| ソースのダウンロード |
もちろんこれはコンパイルできない。
コンパイラはヘッダファイルのみを参考にしてコンパイルを行う為、"main.cpp"をコンパイルしている時は関数E()が存在していないと判断しているのだろう。
ただし、関数E()は"function.cpp"内でだけ使用することが出来るのである。
これが何を意味しているのかは・・・(ニヤリ)
さて、基本は充分抑えたと(←うぬぼれです)思うので、次からはいよいよWindowsアプリケーションのプログラミングに入っていこうと思う。
今までの地味なプログラミングよりは、きっと華やかで楽しいに違いない。
|