• ベストアンサー

main関数を先頭に置くデメリット

C言語で、main関数を先頭に置き、他の関数はプロトタイプ宣言だけ済ませて mainの後に置くという書き方に何かデメリットはあるのでしょうか。 何かの書籍で、「mainは先頭に置く方が何かと良い」と書いてあったので気になっています。

  • ppk37
  • お礼率100% (34/34)

質問者が選んだベストアンサー

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

関数を先に書いてmainをあとにすると、 関数の変更があったら関数を書き換えればいいということですね。 では、main関数を先頭に置き、他の関数はプロトタイプ宣言だけ済ませてmainの後に置くとどうでしょう。 関数の変更は当然必要ですが、プロトタイプの変更を忘れずにすることが必須になりますよね。 そんなことは当然頭のなかに入れて変更作業は行いますが、 人間には悲しいかな、「うっかり」というのが頻発します。 出来ることなら変更仕様に載っている必要な変更部分のみの変更で済めばケアレスミスは減ります。 「mainは先頭に置く方が何かと良い」 というのは、人が見た時、関数からでは全体の処理の流れがわからないからです。 プログラムが実行される順にソースを追う場合、探しまわらなければならなくなるからです。

ppk37
質問者

お礼

ご回答ありがとうございます。 たしかに変更箇所が増えてケアレスミスを招きやすくなりますね。

その他の回答 (3)

回答No.4

お好きにどうぞ。 大きなプログラムを書くときは複数のファイルに分割しますから、 mainだけで一本のファイルにすれば前も後もありませんからね。

ppk37
質問者

お礼

ご回答ありがとうございます。 mainだけで一本のファイルにするのもいいですね。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

プロトタイプ宣言などというものを関数の実体と合わせて書き、メンテナンスの際に同期をとらなくてはいけないというデメリットが…… ……って、それデメリットですかねぇ? 確かに手間ですけど。 コンパイラの側としては、main の位置なんてどこにあってもかまいません。 むしろ、一番前に持ってくることで利益を得るのはプログラマの方です。 main を一番前に持ってくることで、最初から目を通すとまずプログラムの大まかな流れを理解し、そこでの細かな処理をそのあとで把握することができます。 自身が今読んでいるもの・箇所が全体的にどのような位置づけにあるのかを自覚していることはプログラムに限らず書物・文書すべてに当てはまります。 ためしに長めのプログラムの関数を main を一番最後にして並びかえて、先頭から読んでみてください。 main が最後にあるということを知らなければ非常に読みにくくなり、また、関数一覧をまとめたくなることになるでしょう。

ppk37
質問者

お礼

ご回答ありがとうございます。 たしかに全体をまず把握したい気持ちはありますね。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

意味を取り違えてるかもしれませんが 関数からコールされる段階で肩などを明確にするためのプロトタイプ宣言なので main関数の記載後にプロトタイプ宣言してるなら意味ありません

ppk37
質問者

お礼

ご回答ありがとうございます。 こちらの説明が下手ですみません。 プロトタイプ宣言はmainの前で行っている前提での質問でした。

関連するQ&A

  • main関数について

    最近C言語を勉強し始めた者です。 main関数について分からないことがあるので質問致します。main関数は自作関数ですよね。ということは自由に引数を決めていいのですか?つまり int main(int argc , char *argv[]) 以外の引数を決めることは出来るのでしょうか。

  • C言語 main関数とsum関数の記述順について

    はじめまして。 【苦しんで覚えるC言語】(Web版)でC言語を学んでいる初学者です。 【第1部:C言語基礎編】>【関数の作り方】>【自作関数を作る】の部分(http://9cguide.appspot.com/11-01.html#S2)でつまづいています。 下記のような、1から100までの数字の合計を表示するプログラムが例題として取り上げられています。 しかし、ここが理解できないので、次の【プロトタイプ宣言】に進めずにいます。 例題1  sum関数をmain関数の後に記述した場合(プログラムが実行されない)。 #include <stdio.h> int main(void) { return 0; } int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } 例題2  sum関数をmain関数の先に記述した場合(プログラムが実行される)。 #include <stdio.h> int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } int main(void) { return 0; } 例題1の場合、【まずmain関数を作り、次にsum関数を作りました。この場合、main関数を解析している段階では、sum関数は発見されておらず、従って、main関数の中では、sum関数を使うことは出来なくなってしまいます。】との説明がありますが理解できません。 コンパイラがどのような順番でプログラムを処理しているか理解できていないので分からないのだと思います。 例題1の場合と例題2の場合の両方について、コンパイラがどのような順番でプログラムを処理しているのかを具体的に教えてください。 どうかよろしくお願い致します。

  • 関数の呼び出し

    エクセルの2列5行のファイルがあるとします、 このファイルの各列の平均を求める関数をheikinとします。 エクセルの2列のデータの平均を関数heikin(プロトタイプ宣言)のみでの求め方が解かりません。 また、求めた値をmain関数に返した後、別の関数(プロトタイプ宣言)でのheikinの呼び出しかたが解かりません。 各列ごとにプロトタイプ宣言を行えば求まるのですが、 どうかよろしくお願いします。

  • グローバル関数をmainの後で定義する

    VC++6.0です。 mainの中で、グローバル関数を使いたいのですが、 そのグローバル関数の中で、mainの中で生成されたclassを 使用しているので、 グローバル関数を先に定義しておくことができません。 どのようにしたらよいのでしょうか? 「この関数は、後で定義するよ。」という内容の宣言があったような気がするのですが。

  • main関数の戻り値について

    c言語において、main関数の戻り値は何を意味しているのですか。 また、void型にすれば、main関数の戻り値を書かなくても問題無いでしょうか。 また、関数はreturn文を書かなくても、最後まで処理を実行すると終了するらしいですが、void型にすれば、main関数でreturn文を書かなくても問題無いでしょうか。

  • int main()、void main()、void main(void)、int main(void)

    今日、大学でC言語の講義の時間、先生が、 #include <stdio.h> void main(void){ } と宣言してプログラムを書くと教えていました。 main関数には、 main() void main() void main( void ) int main() int main( void ) と、人によりいくつかの描き方があったりします。 どれが本当は正しいのでしょうか? void mainはすべきではないとなんかの本で読んだのですが・・。

  • init関数の意味

    C言語をメインで学習しているのですが、 よく変数の初期化のためにわざわざinitという関数を作って、それをmainの中で実行しているサンプルを見ます。 これだと変数はグローバル変数として宣言しなければいけませんし、init関数なんて作らなくても普通に変数をmainの中で宣言して、同時に初期化すれば良いのではと思ってしまいます。 一体何のためにわざわざinit関数を作るのでしょうか? また、別の質問なのですが、ポインタを使えばグローバル変数を使う必要はないような気がしていて、逆にポインタを使うのが面倒なときでも、グローバル変数で代用できてしまう気がします。 それぞれを使うときのメリット、デメリットがあれば教えていただきたいです。

  • C言語で分割ファイル先の関数を呼び出す時

    いつもお世話になっております. C言語の関数の呼び出しについて質問があります. main文と同じファイルにある関数は,main文より上に記述している場合は プロトタイプ宣言で呼び出すことが出来ますが,ファイルを関数ごとに分割した場合はどうしたら良いのでしょうか? 例えば main_file.c と function_file.c という2つのファイルがあり, それぞれ main と function という関数を持っているとします. main文からfunction関数を呼び出したい場合, 私はいつも main_file.c 内で include "function_file.c" としていますが, これが一般的な方法なのでしょうか? 問題点や改善点を挙げて頂けると助かります. よろしくお願い致します.

  • "main"について

    "main"についての質問です。 今まで私は"main"というのはC言語の予約語の一つだと思い込んでいましたので、"main"は変数名には使えないと思っていました。 ところが以下のようなプログラムを実行してみると問題なくコンパイル出来る上に問題なく実行できました。 int main(void) { int main; main = 300; printf("%d\n", main); return 0; } 確かに入門書などを見直してみると、予約語の中に"main"はありませんでしたし、関数名が変数名として使えないとは書いて無いように思います。 でもなんだかしっくりきません。(^^;) 関数ポインタを使う際などは、変数=関数名(p = myfunction)などと書いたりするので、main関数が格納されているメモリなど変なところを書き換えたりしている可能性があるような気がしたのですが、うまく確認する方法を思いつきませんでした・・・。 ただたんに変数が優先的に処理されているだけというのなら納得するしかないのですが。 どなたか詳しい方がいたら教えてください。よろしくお願いします。

  • どなたか、教えていただけませんでしょうか(C言語)?

    皆様のお知恵を拝借したく思いまして 投稿させていただきました C言語についての質問なのですが (1)文字配列の引数を一度mainからプロトタイプ関数へ渡し 関数で宣言して表示。 (2)さらにその関数内で、値を変更して mainで表示する 方法を教えていただきたく思いますので、宜しくお願い致します

専門家に質問してみよう