dポイントプレゼントキャンペーン実施中!

stddef.hっていうのは

処理系に依存する型とマクロの定義。

ptrdiff_t - ポインタ減算の結果の型
size_t - sizeof 演算子の結果の型
wchar_t - ワイド文字型
NULL - 空ポインタ定数マクロ
offsetof - 構造体のフィールドのオフセットを算出するマクロ

という事だと思うんですが(思うんですがというか引用ですが)
size_tとかこのヘッダファイルインクルードしないでも使えますよね??
なんでなのでしょうか・・。
たとえばインクルードなしで


void main(){
size_t i;
}

でコンパイルしても通ります。stddef.hをインクルードしないといけないときはどんなときなんでしょうか?

A 回答 (3件)

デフォルトで上位のヘッダファイルがインクルードされていませんか?



例えば、main.cに自動的に作られたmain.hがインクルードされてませんか?
そして、main.hにstdlib.hか何かをインクルードするように書かれてませんか?
この場合stdlib.hはstddef.hをインクルードしているので、結果的にstddef.hをインクルードする事になります。

本当にソースコードに
void main(){
size_t i;
}
の3行しかありませんか?

で、本当に上記の3行しかないとしたら、最適化により、未使用の変数の宣言が削除されている可能性があります。

未使用の変数は宣言しても意味がないので、最適化により宣言文が削除され
void main(){
}
になっていると思われます。こうなると、未定義の型を使用しても「無かった事」になり、コンパイルが通ってしまいます。

最適化により、宣言文や代入文や参照行が削除されてしまわないよう
extern void sub(size_t i);
void main(){
sub(0);
}
と書いてコンパイルしたらでうでしょうか?多分
extern void sub(size_t i);
でsize_tが未定義のエラーになる筈です。
    • good
    • 0

手元のBCCでやってみましたがちゃんとエラーになりました


エラー E2451 D:\~\test.c 3: 未定義のシンボル size_t(関数 main )
    • good
    • 0

> size_tとかこのヘッダファイルインクルードしないでも使えますよね??



全くヘッダをインクルードしなくても使える処理系も確かにありますが、少なくとも移植性はありません。
また、<stddef.h>をインクルードしなくても、少なくとも<stdio.h>, <string.h>,<stdlib.h>, <time.h>でもsize_t型が定義されます。

> void main(){

ひとつの可能性としては、mainの定義が間違っているために未定義の動作を引き起こし、コンパイラがパニックになったということも考えられます。

ちなみに、最適化は構文解析よりずっと後に行われるので、コンパイルエラーになるかどうかとは全く関係ありません。
    • good
    • 0

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