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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
トウラ

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

#1

投稿記事 by トウラ » 16年前

#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:標準ライブラリ関数とヘッダファイルの関係

#2

投稿記事 by たかぎ » 16年前

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

non

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

#3

投稿記事 by non » 16年前

学校の環境はなんですか?座学だけですか?

トウラ

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

#4

投稿記事 by トウラ » 16年前

>たかぎさん
回答ありがとうございます。
なるほど、すっきりできました。


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

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

トウラ

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

#5

投稿記事 by トウラ » 16年前

再度質問してみました。

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

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

たかぎ

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

#6

投稿記事 by たかぎ » 16年前

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

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

toyo

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

#7

投稿記事 by toyo » 16年前

gcc3だとstdio.hやstdlib.hやstring.hをincludeしなくてもコンパイルできたりします
gcc4では改善?されましたが

tk-xleader

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

#8

投稿記事 by tk-xleader » 16年前

確かCではプロトタイプ宣言なしでもコンパイルはできた気がしますが…
C99ではプロトタイプが必要になったんでしたっけ…?

non

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

#9

投稿記事 by non » 16年前

たとえどうあれ、組み込み関数を使うときはそれに対応したヘッダーが必要だと
教えるのが学校の先生の役目だと思うな。

たかぎ

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

#10

投稿記事 by たかぎ » 16年前

> たとえどうあれ、組み込み関数を使うときはそれに対応したヘッダーが必要だと
> 教えるのが学校の先生の役目だと思うな。

そういうこと。

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

閉鎖

“C言語何でも質問掲示板” へ戻る