時乃工房-Windowsとアマグラマーな関係-

アクセスアップにオートリンクネット リンクが自動で増殖オートリンクの登録はこちら 節約内職情報検索局
ページランク向上リンク集
役立つリンク集 Web Links
SEO対策ディレクトリ型検索エンジン Su-Jine
メニュー
トップ
アマグラミング
C++編 目次
第2章
第4章
ソフトウェア開発製品
相互リンク

<勘違いだらけのアマグラミングな日々(C++編)>

第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アプリケーションのプログラミングに入っていこうと思う。
今までの地味なプログラミングよりは、きっと華やかで楽しいに違いない。

<前章> <目次> <次章>




<時乃工房>
Net Office Nakai
メビウスリング投稿掲示板には小説日記ゲームアニメコミック小学生中学生などの掲示板過去ログがあります。相互リンクも募集中。