C言語ヘッダファイルとライブラリのいくつかの問題を分析します。


gccを使ったコンパイラのヘッダファイルにはstdlib.hが含まれていません。atoo関数を使ってstdlib.hでしか声明がありません。コンパイルは間違いがありません。もしコンパイルする時に-Wallオプションを加えると警告があります。なぜですか?これはC言語の非常に愚かな規定のためです。一つの関数が宣言関数のプロトタイプでないと、その戻り値のタイプはintです。atooiは本当にintに戻っていますので、それを含まなくてもヘッダファイルを間違えません。この警告は、関数のプロトタイプを忘れたためにあなたが間違えないようにするためです。コンパイラは、定義されていない関数のプロトタイプに対して、直接にそれとしてintを返す必要がありません。つまり、パラメータのリストでatooを呼び出すと、コンパイラはこの関数のパラメータリストが何であるかを知っています。戻り値だけが分かりません。この場合、コンパイラは他のものが必要ですか?もちろん通過できます。注意:コンパイラはどのヘッダファイルで関数が定義されているかに関心がありません。この関数のプロトタイプを知るだけでいいです。

#include<stdio.h>
//#include<stdlib.h>
int main()
{
int i;
double f;
char b[5] = "23";
char c[5] = "2.3";
i = atoi(b);
f = atof(c);
printf("i=%d f=%lf
", i, f);
return 0;
}
gcc testは何の警告もありません。gcc-Wall test.c-o testは警告がありません。w 9.c:In function`main':w 9.9:warning:implicit declaration o f`w9.9:10:warning=86普通はatooとatooはC標準ライブラリglibcにありますが、C標準ライブラリ関数sqrtとpowはglibcにありません。