FC2ブログ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

一言で言えば: エラーメッセージをちゃんと読もう!


最近、K&Rを父親から譲り受けたので写経しつつ読んでいる。

で、第1章第9チャプター(※)の例を写経してgccに投げると、
※古い版なので新しい版と違うかも


$ gcc maxcharcount.c
maxcharcount.c:4:5: エラー: ‘getline’ と型が競合しています
int getline(char line[], int maxline);
^
In file included from maxcharcount.c:1:0:
/usr/include/stdio.h:678:20: 備考: 前の ‘getline’ の宣言はここです
extern _IO_ssize_t getline (char **__restrict __lineptr,
^
maxcharcount.c:27:5: エラー: ‘getline’ と型が競合しています
int getline(char s[], int lim)
^
In file included from maxcharcount.c:1:0:
/usr/include/stdio.h:678:20: 備考: 前の ‘getline’ の宣言はここです
extern _IO_ssize_t getline (char **__restrict __lineptr,


というエラーが出た。

最初はプロトタイプ宣言と関数の宣言で型が違うのかなと思っていたが何度見ても違う。

諦めて「K&R getline」とか頭の悪い感じでググったらズバリなページがヒットした
Why do I get a “conflicting types for getline” error when compiling the longest line example in chapter 1 of K&R2? - Stack Overflow

簡単に言えばglibcのstdio.hにgetlineという関数がすでに定義されていた。

そう!察しのいい方ならすでに気づいていると思う!
さっきのエラーメッセージに出ているのだ!!

In file included from maxcharcount.c:1:0:
/usr/include/stdio.h:678:20: 備考: 前の ‘getline’ の宣言はここです
extern _IO_ssize_t getline (char **__restrict __lineptr,


ちゃんと読まないからこういうことになるのだ…

解決方法は被らないようにgetline以外の名前をつければOK。

またどうしてこうなるかというと、先ほどのページいわくgetlineという関数はGNU/POSIX拡張らしい。

で、K&Rは表紙を見ればわかる通り「ANSI規格準拠」である。(それ以前のK&Rは知らんということで)

そんなわけだからK&R的にはそんな拡張知ったこっちゃないのである。

また先ほどのページはGNU/POSIX拡張を使わない方法も示している。

gccのオプションに「-ansi」または「-std=c89」をつけるという方法だ。


結論
・エラーメッセージを読む
・エラーメッセージをちゃんと読む
・エラーメッセージを穴が開くほど読む
スポンサーサイト

Thoughts on スポンサーサイトK&R写経してたら「型が競合しています」と言われた話

Leave a Reply

* 16文字以内
* 24文字以内
* 16文字以内
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。