ページ 11

標準ライブラリ関数とヘッダファイルの関係

Posted: 2009年6月22日(月) 19:06
by トウラ
#include <stdio.h>

int main()
{
	int* p = (int*)malloc(sizeof(int));

	*p = 5;

	printf("%d\n" , *p);

	free(p);

	return 0;
}
(学校で使っている教科書のソースコードを今回の質問に合わせたものです)

malloc,free関数を使っているのにインクルードしているのがstdio.hだけなので
これを疑問に思い教授に質問してみました。
すると、処理系によるよと答えていただけたのですが、そうなのでしょうか?

私は、処理系によるというのを
処理系によっては標準ライブラリ関数が宣言されているヘッダファイルが違うことがある
と解釈したのですが、こういうことはあるのでしょうか?

とりあえず納得して帰ったのですが、自宅で上記コードをコンパイルしてみると
error C3861: 'malloc': 識別子が見つかりませんでした
error C3861: 'free': 識別子が見つかりませんでした
というエラーが出ました。
(Vista VC++2008EE です)

処理系による、ということはたまたまVC++がコンパイルできないだけ
なのかもしれませんが、やっぱりなんだかすっきりしません。
私なりに調べてみましたが、stdlib.hが必要と書いてあるところばかりでした。
(サイトによってはmalloc.hも)

Re:標準ライブラリ関数とヘッダファイルの関係

Posted: 2009年6月22日(月) 19:10
by たかぎ
mallocやfreeを使うには、<stdlib.h>をインクルードする必要があります。
標準ヘッダでは、勝手に関係のない宣言を行うことはできませんので、非標準処理系か処理系の不具合以外の理由で、<stdio.h>でmallocやfreeが宣言されることはありません。

Re:標準ライブラリ関数とヘッダファイルの関係

Posted: 2009年6月22日(月) 19:38
by non
学校の環境はなんですか?座学だけですか?

Re:標準ライブラリ関数とヘッダファイルの関係

Posted: 2009年6月22日(月) 21:02
by トウラ
>たかぎさん
回答ありがとうございます。
なるほど、すっきりできました。


>nonさん
>学校の環境はなんですか?座学だけですか?
申し訳ありません。環境は聞いてませんでした。(生徒側がPCを触ることはありません)

なので今まで気にしたことがなかったのであいまいな記憶なのですが
CentOS GCC だと思います。
(明日確認します。)

Re:標準ライブラリ関数とヘッダファイルの関係

Posted: 2009年6月24日(水) 18:45
by トウラ
再度質問してみました。

まず、教授持参のPCでもstdlib.hをインクルードしないとコンパイルできなかったようです。
教科書と同じコードを書いているだろうと私が勝手に思い込んでいました。

そして"処理系によるよ"と答えていただいた意味には
・標準に準拠していない処理系もある
・インクルードを省略してもコンパイルできる処理系もある
 (××がインクルードされてないよという警告などが出るがコンパイルは通るそうです)
ということが含まれていたそうです。

Re:標準ライブラリ関数とヘッダファイルの関係

Posted: 2009年6月24日(水) 18:52
by たかぎ
> そして"処理系によるよ"と答えていただいた意味には
> ・標準に準拠していない処理系もある
> ・インクルードを省略してもコンパイルできる処理系もある
>  (××がインクルードされてないよという警告などが出るがコンパイルは通るそうです)
> ということが含まれていたそうです。

おそらくその教授は理解していません。
話半分に聞いておいた方がよいでしょう。

Re:標準ライブラリ関数とヘッダファイルの関係

Posted: 2009年6月24日(水) 19:14
by toyo
gcc3だとstdio.hやstdlib.hやstring.hをincludeしなくてもコンパイルできたりします
gcc4では改善?されましたが

Re:標準ライブラリ関数とヘッダファイルの関係

Posted: 2009年6月24日(水) 20:43
by tk-xleader
確かCではプロトタイプ宣言なしでもコンパイルはできた気がしますが…
C99ではプロトタイプが必要になったんでしたっけ…?

Re:標準ライブラリ関数とヘッダファイルの関係

Posted: 2009年6月24日(水) 21:53
by non
たとえどうあれ、組み込み関数を使うときはそれに対応したヘッダーが必要だと
教えるのが学校の先生の役目だと思うな。

Re:標準ライブラリ関数とヘッダファイルの関係

Posted: 2009年6月24日(水) 21:59
by たかぎ
> たとえどうあれ、組み込み関数を使うときはそれに対応したヘッダーが必要だと
> 教えるのが学校の先生の役目だと思うな。

そういうこと。

処理系の不具合で、どうしても正統な方法が使えないのなら仕方ありませんが、それ以外の理由でおかしな方向に教え子を導くのはダメです。
# そうはいいつつも、いろいろとしがらみがあるのが教育現場の実情ですが...