最近 [ C ]を始めたのですが、冒頭から不明な部分あり
ご存知の方がおりましたら、御教授願います。
[ C ]の入門書等に以下の記載が有りますが
void main ( void )
{
中略
}
これを
gcc でコンパイルするとエラー
g++ でコンパイルすると正常終了となります。
行頭の void を削除して [ main ( void ) ] とするか
[ int main ( void ) ] とすれば、問題なくどちらでもコンパイル
出来るのですが...
これは、入門書が間違っているのでしょうか?
それとも gcc 側に問題があるのでしょうか?
入門書には gcc でコンパイル出来ると書いてあるのですが...
# gcc version 2.96 20000731 (Kondara MNU/Linux 2.1)
以上、よろしくお願いします。
K.Moriyama
>> void main ( void )
>> gcc でコンパイルするとエラー
>> g++ でコンパイルすると正常終了となります。
私は C++ を知らないので、なんで g++ で通るかは私はわかりませんが、
ANSI C なら main() は int のはず。
ぐぐってみたら、
http://www.amy.hi-ho.ne.jp/~lepton/program/prog/prog78.html
にだいたい正しそうな記述を発見したので読んでみて下さい。
# ざっとみただけなので細かいところまであってるかは保証しませんけど。
>> これは、入門書が間違っているのでしょうか?
>> それとも gcc 側に問題があるのでしょうか?
>> 入門書には gcc でコンパイル出来ると書いてあるのですが...
「入門書」が間違っています。
参考までに、その本は何という名前の本ですか?
C に限らず、入門書と書けば適当でもいいと思っているかのような本が多すぎ。
正確さという意味では K&R の第二版が一番だと思うんですが、
日本語が難しくて意味を解釈するのが難しい気もするので、
この本ともう二、三冊ほど買って比較しながら読むのがいいかも。
--
Takeshi Kusune <kus...@sfc.wide.ad.jp>
入門書が誤りを拡散するのは本当に困ったものです。
> 正確さという意味では K&R の第二版が一番だと思うんですが、
> 日本語が難しくて意味を解釈するのが難しい気もするので、
K&R は、規格準拠という点でどうかは知りませんが、
多くの記述が今日では「むしろ避けるべき悪い例」に
なってしまっているので、私はお勧めしません。
K&R はお守り代わりに買って積んでおくのがよろしいかと。
C++ プログラマーズハンドブックっていう本が大変お勧めなのですが、
残念なことに絶版です。偶然見付けたらガメましょう。薄い本です。
// これ一冊では十分ではありませんが。
--
Naoto Shimazaki
/* 金曜夜につき若干アルコール汚染気味です... */
From: "K.Moriyama" <for...@ma.kcom.ne.jp>
Subject: [linux-users:100082] C の [ void main ( void ) ]について
Date: Fri, 11 Jul 2003 22:59:54 +0900
forest> [ C ]の入門書等に以下の記載が有りますが
forest>
forest> void main ( void )
forest> {
forest> 中略
forest> }
forest>
forest> これを
forest>
forest> gcc でコンパイルするとエラー
forest> g++ でコンパイルすると正常終了となります。
forest>
forest> 行頭の void を削除して [ main ( void ) ] とするか
forest> [ int main ( void ) ] とすれば、問題なくどちらでもコンパイル
forest> 出来るのですが...
forest>
forest> これは、入門書が間違っているのでしょうか?
はい。間違っています。
main() は、int を返す関数として宣言されなければなりません。
ところが、某M社の流儀では、main() は void(=戻値を持たない)である、と
聞いたことがあります。
そのため、そういった入門書も出てきてしまうのでしょう。
void を外すとコンパイルできるようになるのは、C では、指定されていない
(=デフォルトの)型は int になるため、main() が int 型を返すものとして
扱われるようになるためではないでしょうか。
forest> それとも gcc 側に問題があるのでしょうか?
forest> 入門書には gcc でコンパイル出来ると書いてあるのですが...
forest>
forest> # gcc version 2.96 20000731 (Kondara MNU/Linux 2.1)
今、(私は、main() を void で宣言したことがなかったため)
私の環境(gcc 2.95.3)で "Hello World" :-) を試したところ、
warning は出ましたが、コンパイル、実行とも出来ました。
(もちろん、戻値は変です)
私の手許に、同じ環境がないため、推測になってしまいますが、
森山さんの環境でも、警告が出ているだけで、
実はコンパイル出来ているようなことはないでしょうか。
そうでない(=現在、本当にコンパイルできない)場合、
その書籍を執筆した方が確認したバージョンでは動いたため、
それで良としてしまったのかもしれません。
何れにせよ、酷い書籍を手にしてしまいましたね...
On Sat, 12 Jul 2003 01:41:20 +0900
Naoto Shimazaki <i...@arhc.org> wrote:
> > 正確さという意味では K&R の第二版が一番だと思うんですが、
> > 日本語が難しくて意味を解釈するのが難しい気もするので、
>
> K&R は、規格準拠という点でどうかは知りませんが、
> 多くの記述が今日では「むしろ避けるべき悪い例」に
> なってしまっているので、私はお勧めしません。
> K&R はお守り代わりに買って積んでおくのがよろしいかと。
「むしろ避けるべき悪い例」とは、たとえばどんな内容ですか?
# 私はソースの例が頭使って読まなきゃいけないのばっかなので
# K&R は苦手でした。
---
Tomohiko Yoshida <dyna...@Garagesounds.gs>
http://store.sbpnet.jp/bm_detail.asp?sku=4797323450
>> On Sat, 12 Jul 2003 01:41:20 +0900
>> Naoto Shimazaki <i...@arhc.org> wrote:
>> > K&R は、規格準拠という点でどうかは知りませんが、
>> > 多くの記述が今日では「むしろ避けるべき悪い例」に
>> > なってしまっているので、私はお勧めしません。
>> 「むしろ避けるべき悪い例」とは、たとえばどんな内容ですか?
言語仕様の可能性や制約を示すためか、例は極端なものも多いし、
演習もかなりひねったものが多いように思いますね。
プログラミング初心者が導入のために読むにはあわないでしょう。
私が K&R を読むのは、後半をリファレンス的に使う時とか、
細部の解釈がどうなっているのか確認する時なので、
そうした点で信頼に足る本があれば代用できるでしょう。
でもあんまりないですよね。
ちなみに、
私が C 言語をはじめた時は、処理系依存のものとかいわゆる入門書とか、
およそおすすめできない本を片手にフリーウェアのソースと戦ってたんですが、
慣れてくるといろいろおかしい点に気付くようになり、噂の K&R を読んで、
「ああ、こういうことだったのか」といろいろ納得がいったというかんじです。
というわけで、初めはいわゆる入門書で「動けばいいや」で始めてみて、
それなりに慣れてきてから K&R や「間違いだらけの~」的な本で軌道修正
というのも、納得ずくでいくなら悪くないかも。人を選ぶでしょうけど。
--
Takeshi Kusune <kus...@sfc.wide.ad.jp>
"K.Moriyama" <for...@ma.kcom.ne.jp> wrote:
> void main ( void )
> {
> 中略
> }
>
> これを
>
> gcc でコンパイルするとエラー
> g++ でコンパイルすると正常終了となります。
> # gcc version 2.96 20000731 (Kondara MNU/Linux 2.1)
2.95.3 でも 3.3 でも大丈夫です(Warning は出ますが)。使うべきでないと
されている gcc 2.96 以降 3 未満の癖でしょうか。
http://gcc.gnu.org/gcc-2.96.html
もしよろしければエラーメッセージをお教えいただけませんでしょうか。
--
Haruhiko Okumura <oku...@matsusaka-u.ac.jp>
Matsusaka University, 1846 Kubo-cho, Matsusaka, 515-8511 Japan
http://www.matsusaka-u.ac.jp/~okumura/
便乗質問なのですが、C++ の方の
The C++ Programming Language (Special 3rd Edition)
ISBN: 0201700735
は、C で K&R を読んで「勉強になった」と感じたような人には、
お薦めできる本でしょうか?
# こちらは、K&R みたく略称はあるのですか?
---
渡辺 崇史
lie...@lieudna.org
では例を一つ。
バッファオーバーフローを引き起こす例示がいくつも出て来ます。
例えば、K&R の中には strcpy()、strcat(), fgets() の実装例が
出てきます。これらは標準 C に含まれる関数ではありますが、
バッファオーバフローをおこしやすいために、今日ではむしろ
避けることを推奨されています。
2002 年の統計によれば、バッファオーバーフローは脆弱性の原因の
約 2 割を占めています。バッファオーバーフローを引き起こす
プログラムは、初学者向けの本では読者の目に触れないように排除され、
また上級者向けの本では悪い例として示されるのが良いと思います。
そういう観点でみると、K&R は望ましくないのです。
K&R が書かれた当時にしてみれば、バッファオーバーフローの深刻さが
今程認識されていなかったのでしょうから、しかたない面はあります。
しかし、事実として、今日の需要には合わなくなってしまっているのです。
--
Naoto Shimazaki
From: Naoto Shimazaki <i...@arhc.org>
Subject: [linux-users:100094] Re: C の [ void main ( void ) ]について
Date: Sat, 12 Jul 2003 12:35:58 +0900
Message-ID: <87llv4...@portellen.arhc.org>
> 例えば、K&R の中には strcpy()、strcat(), fgets() の実装例が
> 出てきます。これらは標準 C に含まれる関数ではありますが、
> バッファオーバフローをおこしやすいために、今日ではむしろ
> 避けることを推奨されています。
fgets ?
getsではなくて?
From: Takeshi Kusune / 楠根 雄志 <kus...@sfc.wide.ad.jp>
Subject: [linux-users:100083] Re: C の [ void main ( void ) ]について
Date: Sat, 12 Jul 2003 01:14:41 +0900
Message-ID: <200307111614....@kokone.v6.linux.or.jp>
> 正確さという意味では K&R の第二版が一番だと思うんですが、
> 日本語が難しくて意味を解釈するのが難しい気もするので、
> この本ともう二、三冊ほど買って比較しながら読むのがいいかも。
御意。
あと、「Language C FAQ」はとても教育的ですよね。
日本語訳があちこちに置いてあります。例えば、
http://www.catnet.ne.jp/kouno/c_faq/
void main()の話もあったとおもいます。
>あと、「Language C FAQ」はとても教育的ですよね。
Steve Summit著
「C Programming FAQs」
の事でしょうか。
int main(int argc, char *argv[])
{
}
が本当だと思っていましたが、
「main()はintを戻り値とし、(適切な型の)0個か2個の引数を持つと定義しなけ
ればならない。」
とのこと。うーん勉強になった。
ちなみに我が家のRedHat9の
cc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
では、
ワーニングは出るんですが、エラーにはならないんですが。
ソース:
void main(void)
{
printf("test!\n");
}
コンパイルメッセージ
test.c: 関数 `main' 内:
test.c:2: 警告: `main' の戻り値の型が `int' ではありません
実行モジュールは出来ます。
Takeshi Kusuneさん Naoto Shimazaki さん 亀岡さん 岡崎さん小野寺さん
ありがとうございました
> http://www.amy.hi-ho.ne.jp/~lepton/program/prog/prog78.html
> http://www.catnet.ne.jp/kouno/c_faq/
上記サイト読んでみました、疑問が解けてスッキリしました。
On Sat, 12 Jul 2003 01:54:47 +0900
ONODERA Keiichi <kei...@po.jah.ne.jp> wrote:
> 私の環境(gcc 2.95.3)で "Hello World" :-) を試したところ、
> warning は出ましたが、コンパイル、実行とも出来ました。
> (もちろん、戻値は変です)
>
> 私の手許に、同じ環境がないため、推測になってしまいますが、
> 森山さんの環境でも、警告が出ているだけで、
> 実はコンパイル出来ているようなことはないでしょうか。
On Sat, 12 Jul 2003 19:29:44 +0900
岡崎 <jf...@lime.ocn.ne.jp> wrote:
> ちなみに我が家のRedHat9の
> cc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
> では、
> ワーニングは出るんですが、エラーにはならないんですが。
On Sat, 12 Jul 2003 08:45:16 +0900
Haruhiko Okumura <oku...@matsusaka-u.ac.jp> wrote:
> 2.95.3 でも 3.3 でも大丈夫です(Warning は出ますが)。使うべきでないと
> されている gcc 2.96 以降 3 未満の癖でしょうか。
すみません ワーニングでした。サンプルブログラムをコンパイル
した時にエーラーが続出して、コンパイル出来なかった為、手直しして
いて最後に残ったのが [ void main ( void ) ] だった為、コンパイル
出来ていない物と思い込んでいました。
実際には警告のみで、コンパイル出来ていました。
# 何故、気がつかなかったのか...
On Sat, 12 Jul 2003 01:14:40 +0900
Takeshi Kusune / 楠根 雄志 <kus...@sfc.wide.ad.jp> wrote:
> 参考までに、その本は何という名前の本ですか?
下記 書籍です。
A, いますぐ始めるLinuxのC言語 長谷川裕行 著 エーアイ出版
B, 入門 ANSI-C 石田晴久 監修/執筆 後藤良和 高田大二 中島 寛和 執筆
実教出版
[ A ]は最初は [ main () ]となっていますが、途中から
[ voic main ( viod ) ]となっていて、以下の記載が有ります。
[ main ( ) としてもかまいませんが、正しくは
void main ( void ) とします。 ]
[ B ] は、前書きに
プログラムの書式を厳密にANSI準拠とした。
main関数の書き方を、[ main () ] から[ void main (void )]
と改めた。
と記載されています。
さらに [ A ] の著者は、以下の本も出しており
もっと極めるLinuxの言語 エーアイ出版
SE・プログラマスタートアップテキストC言語基礎 技術評論社
これらは、[ voic main ( voic ) ]で一貫しています。
特に [ もっと極める... ]は、[ A ]の続編ですから
被害は甚大ではないかと...
> 正確さという意味では K&R の第二版が一番だと思うんですが、
一応購入してはあったのですが....
> C++ プログラマーズハンドブックっていう本が大変お勧めなのですが、
> 残念なことに絶版です。偶然見付けたらガメましょう。薄い本です。
古本屋に行ってみましたが、ありませんでした。見掛けたら
即購入します。
みなさん、ありがとうございました。
K.Moriyama
すみません記載ミスがありました。先のメールで以下の部分は
>もっと極めるLinuxの言語 エーアイ出版
> これらは、[ voic main ( voic ) ]で一貫しています。
以下が正しい文章です。
[ もっと極めるLinuxのC言語 エーアイ出版 ]
[ これらは、[ void main ( void ) ]で一貫しています。]
どうもすみませんでした。
K.Moriyuama