プロが教えるわが家の防犯対策術!

#include <stdio.h>

main()
{ 
   printf("hello,world\n");
}

と初歩のプログラムをコンパイルしたのですが
「関数は値を返すべき(関数 main)」とでます
本見て試しに書いたのでどこが間違ってるのかわかりません。
よろしければ教えてください。。
使用しているコンパイラはborland C++ Turbodebu
です

A 回答 (6件)

( borland C++ としていることからOSは、Windows として)



>「関数は値を返すべき(関数 main)」とでます

 これは、エラーではなく「警告」ですよね。
 「警告もなくしたい」と考えることは、大事なことだと思います。

 ただ、main 関数に関する警告は特殊(?)で、過去にも「質問」が多くあります。
 その中から、2件上げてみます。

  http://okwave.jp/qa3185703.html
  http://okwave.jp/qa3794915.html

 「特殊」なことが理解できたかと思います。

(「初心者」にとって、小難しい話で申し訳ない)
------------------------------------------
>本見て試しに書いたのでどこが間違ってるのかわかりません。

 お示しのソースの main() に、「型」が付いていません。
 Cでは、「型」が無い関数は、自動的に int 型となります(▼)。

 int 型の関数は、main 関数であっても「呼出し元」に int 型の値を返さなくてはいけません。

 この「int 型の値を返す」return 文がないことから「警告」となりました(「エラー」ではない)。

☆なんか「おおらかな」言語ですよね。「実行文」はできちゃうのだから・・。
------------------------------------------
では、どうやって「警告」をなくすか。

 先に示した「質問」のやり取りでお判りと思います。

 void main() または、int main() + return( 0 ); とすることで「警告」はなくなります。
 なお、int main() の int は、必須ではありません(▲)。

★ void main() は、規格(C99)では「4種類の方法」の内の「処理系定義の方法」で、borland C++ はOKです。

 話はそれますが、main() を再帰で使うのは、年寄りにはチンプンカンプンです。

 http://okwave.jp/qa4137733.html  ←No.3 さんの回答の前段。
------------------------------------------
プログラム(int main())の「呼出し元」は、OSです。

プログラム終了時、OSには「終了コード(0-255)」として渡されます。
渡された終了コードを使うかどうかは、OSではなく、プログラムを「実行する人」が決めます。

OSは、「蛙の面に小便」状態です(終了コード=小便)。

終了コードを(バッチファイル等で)使うことを想定していないのであれば、

★ void main() が return 文1行分、節約できてお勧めです。
++++++++++++++++++++++++++++++++++++++++++
ただし、質問者様が学生で、ソースを提出する場合は、

  main 関数は、int 型と明示し、

  return( 0 ); で結ぶべきです( () 省略可)。

理由
・先生が、現在の規格(古い規格では、int 型のみ)を知らないことが想定される。
・なんらかの形(例 return( 学籍番号 );と改変)で終了コードを評価に利用?することも考えられる。
    • good
    • 0

言語仕様の話をすると、main関数はちょっと特別で、


もしreturn文がなくてもreturn 0;とみなすことになっているですが、
> ISO/IEC14882:2003 (C++)
> If control reaches the end of main without encountering a return statement,
> the effect is that of executing
> return 0;

> ISO/IEC9899:1999 (C)
> reaching the } that terminates the main function returns a value of 0.

コンパイラがこれに対応してないのでしょう。
例えば、VC7.1や8などはmainのreturn文を省略しても通ります。
(古いのは通らなかったような気もしますが…未確認)

なぜこんなことになっているかというと、むかーし、仕様が固まる前に
returnを省略して書かれた提示のようなコードが残存してるせいです。

古いコードの互換性などのためにあるルールですので、
昨今、このようなルールでコードを書くことはあまり好ましくないと思います。
多分、参考にしている本の内容ベースが古いのではないでしょうか。

既に回答があるように、mainの戻りも含め省略せずに書いた方がいいかと思います。
    • good
    • 0

ちなにみ、なんという本なのでしょうか?


残念ながら、世の中にはあまりよくない本も存在しているようです・・・。
    • good
    • 0

C言語の規格で、main関数の戻り値はint型であると


決まっているようです。
したがって、

int main(void)
{
/* 何かの処理 */
return 0;
}

とか

int main(int argc, char **argv)
{
/* 何かの処理 */
return 0;
}

のように、型(省略すればintとみなす)とreturn文を書きます。
    • good
    • 0

というより、本来は



int main(void)
{ 
printf("hello,world\n");
return 0;
}

としないといけません。
一部のコンパイラはこの辺りいろいろ書き方が変わってくる場合もあり
ますがコンパイルできたとしても仕様上は記述が間違っています。

大抵のコンパイラは

void main(void)
{ 
printf("hello,world\n");
return;
}

もできるようですがこれもやっちゃいけないんですね。
エラーも警告もでないし、ほとんどの場合は正常に動作するので
当たり前のように使用していました。

参考URL:http://www.6809.net/tenk/html/cgokai/int_main.htm
    • good
    • 0

return 0; が抜けてるよ


最後の}の前
    • good
    • 0
この回答へのお礼

ありがとうございました。教科書ではこれでちゃんと表示できるらしいんですが、省略しているのかな。

お礼日時:2008/08/13 02:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!