- ベストアンサー
stddef.hの役割とは?
- stddef.hは処理系に依存する型とマクロを定義したヘッダファイルです。
- 主な定義として、ptrdiff_t(ポインタ減算の結果の型)、size_t(sizeof演算子の結果の型)、wchar_t(ワイド文字型)、NULL(空ポインタ定数マクロ)、offsetof(構造体のフィールドのオフセットを算出するマクロ)などがあります。
- ただし、size_tなどの型はstddef.hをインクルードせずに使用することもできますが、正しい使い方はインクルードすることです。使用する際には、インクルードが必要な環境やコンパイラの設定によって異なる場合があります。
- みんなの回答 (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が未定義のエラーになる筈です。
その他の回答 (2)
- php504
- ベストアンサー率42% (926/2160)
手元のBCCでやってみましたがちゃんとエラーになりました エラー E2451 D:\~\test.c 3: 未定義のシンボル size_t(関数 main )
- jacta
- ベストアンサー率26% (845/3158)
> size_tとかこのヘッダファイルインクルードしないでも使えますよね?? 全くヘッダをインクルードしなくても使える処理系も確かにありますが、少なくとも移植性はありません。 また、<stddef.h>をインクルードしなくても、少なくとも<stdio.h>, <string.h>,<stdlib.h>, <time.h>でもsize_t型が定義されます。 > void main(){ ひとつの可能性としては、mainの定義が間違っているために未定義の動作を引き起こし、コンパイラがパニックになったということも考えられます。 ちなみに、最適化は構文解析よりずっと後に行われるので、コンパイルエラーになるかどうかとは全く関係ありません。