
stddef.hっていうのは
処理系に依存する型とマクロの定義。
ptrdiff_t - ポインタ減算の結果の型
size_t - sizeof 演算子の結果の型
wchar_t - ワイド文字型
NULL - 空ポインタ定数マクロ
offsetof - 構造体のフィールドのオフセットを算出するマクロ
という事だと思うんですが(思うんですがというか引用ですが)
size_tとかこのヘッダファイルインクルードしないでも使えますよね??
なんでなのでしょうか・・。
たとえばインクルードなしで
void main(){
size_t i;
}
でコンパイルしても通ります。stddef.hをインクルードしないといけないときはどんなときなんでしょうか?
No.1ベストアンサー
- 回答日時:
デフォルトで上位のヘッダファイルがインクルードされていませんか?
例えば、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が未定義のエラーになる筈です。
No.2
- 回答日時:
> size_tとかこのヘッダファイルインクルードしないでも使えますよね??
全くヘッダをインクルードしなくても使える処理系も確かにありますが、少なくとも移植性はありません。
また、<stddef.h>をインクルードしなくても、少なくとも<stdio.h>, <string.h>,<stdlib.h>, <time.h>でもsize_t型が定義されます。
> void main(){
ひとつの可能性としては、mainの定義が間違っているために未定義の動作を引き起こし、コンパイラがパニックになったということも考えられます。
ちなみに、最適化は構文解析よりずっと後に行われるので、コンパイルエラーになるかどうかとは全く関係ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
静的でないメンバ関数の呼び出...
-
C#でトーンカーブの作成
-
既定のコンストラクタがありま...
-
C# KeyDownイベントでショート...
-
void*型の配列について
-
【gcc・cygwin】multiple defin...
-
C++にてtemplateで受け取った任...
-
プログラム作成教えてください...
-
GDI+の使用方法について
-
【VC++6.0】イベントハンドラ関...
-
const_castのつかいどころを教...
-
構造体を宣言と共に初期化する方法
-
unityの教科書のゲームを作って...
-
C で、関数の中から、別の関数...
-
画面上をクリックするとクリッ...
-
自作DirectShow Filterのinter...
-
プロセシングの質問です。
-
C++でオーバーロードに関するバ...
-
このプログラミングの問題の2つ...
-
Aの値からBの値を除するとは??
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがありま...
-
静的でないメンバ関数の呼び出...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
const_castのつかいどころを教...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
Notepad++の関数リスト表示の変...
-
C#でテンキーの操作は可能でし...
-
[Visual C++ 6.0] コンパイル(...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
関数ポインタについて
-
void*型の配列について
-
C言語 プロトタイプ宣言
-
pictureboxの画像を削除するには?
-
カノニカルモードの設定について
おすすめ情報